【发布时间】:2018-02-10 03:13:05
【问题描述】:
我将我的 Django 应用程序部署在 Heroku 上的免费测功机中 目前,我正在从 JQuery-1.12.4 版本发送一些 GET 和 POST 请求
在我的应用程序的本地开发版本中,对我的 REST 端点服务的请求是有效的 这是获取用户帖子的示例,从 ajax 消费到端点休息服务
这是我的本地 Django 服务器
我在 Heroku free dyno 上部署了相同的用户界面,但行为如下:
服务器抛出错误 500,虽然发生了一些不寻常或奇怪的情况 以前,当我在 Heroku 部署中首次为该用户创建用户时,创建和获取帖子功能正常工作。就像在我的本地环境开发中一样。
Heroku 只接受来自 JQuery AJAX 的 GET 和 POST 请求给这个用户,如下图所示:
我不知道 Heroku 喜欢生产/测试服务器部署不接受或接受有限 AJAX 请求的原因。有可能(我认为是这样,而且太合乎逻辑了)这种行为是由于我使用的是免费的 dyno heroku 服务器吗?
为什么只接受一个用户和其他用户的 ajax 请求,如上图所示,ajax 请求不起作用?
在this question谈话题,但我没有明确这个话题
对于我的项目部署,还有哪些其他选项建议我?
AWS EC2?可能吗?
Heroku 免费测功机,不要让我看日志,因为在这个免费测功机中,不保存文件..
我很欣赏有关它的一些指导。
最好的问候
更新
根据to this answer,我可以查看我的heroku部署中的日志
目前,GET 和 POST 操作中的日志只告诉我status 500
这是我执行 GET 请求时的日志
2017-09-01T12:34:31.053127+00:00 heroku[router]: at=info method=GET path="/api/post/?q=" host=hostayni.herokuapp.com request_id=acd319f7-d47d-4e6c-833f-a0ef34163c51 fwd="190.240.77.93" dyno=web.1 connect=1ms service=615ms status=500 bytes=253 protocol=http
这是我执行 POST 请求时的日志
2017-09-01T12:37:56.512868+00:00 heroku[router]: at=info method=POST path="/api/post/create/" host=hostayni.herokuapp.com request_id=6d51cd89-431e-4b6e-80fe-55a505433fcc fwd="190.240.77.93" dyno=web.1 connect=1ms service=150ms status=500 bytes=253 protocol=http
此时我不知道如何从我的 JQuery ajax 请求中处理与 status=500 相关的问题
这是继承 ListAPIView 的我的视图代码。在这里,我正在创建一个端点 /api/post/,其中发送 ajax GET 请求以检索用户帖子
在这个视图中,我管理两个场景:
a. 我收到用户查看他们帖子的请求 b.我请求我关注的用户列表并检索他们的帖子
class PostListAPIView(generics.ListAPIView):
serializer_class = PostModelSerializer
pagination_class = StandardResultsPagination
def get_queryset(self, *args, **kwargs):
# Capturamos el request de un usuario
requested_user = self.kwargs.get("email")
if requested_user:
# Para ver los posts mios y los que reposteo
qs = Post.objects.filter(user__email=requested_user).order_by('-timestamp')
query = self.request.GET.get("q", None)
if query is not None:
# Para buscar por usuario y por su contenido
qs = qs.filter(
Q(content__icontains=query) |
Q(user__email__icontains=query)
)
return qs
else:
im_following = self.request.user.profile.get_following()
# Mostrando los posts de los usuarios que sigo
# Bind querysets
# Para ver los posts de los que sigo y los mios
qs1 = Post.objects.filter(user__in=im_following)
qs2 = Post.objects.filter(user = self.request.user)
qs = (qs1 | qs2).distinct().order_by('-timestamp')
# print(self.request.GET)
query = self.request.GET.get("q", None)
if query is not None:
qs = qs.filter(
Q(content__icontains=query) |
Q(user__email__icontains=query)
)
return qs
从我的 html 模板中,我以这种方式执行 ajax GET 请求:
{% extends "layout.html" %}
{% block script %}
// Codigo basico para traernos datos de REST
<script>
$(document).ready(function(){
console.log("working");
$.ajax({
url: "/api/post/",
method: "GET",
success: function (data) {
console.log("the data are")
console.log(data)
},
error: function(data){
console.log("error")
console.log(data)
}
})
});
</script>
{% endblock script %}
我非常感谢有关它的一些指导。
【问题讨论】:
-
我建议在您的应用程序中设置更好的日志记录,以便您可以看到 500 错误的完整回溯。您可以设置电子邮件日志记录以通过电子邮件将任何错误发送给您。 See this page
-
相反,您可以使用Sentry 之类的服务。它对单个用户免费,并且非常易于设置。它会向您发送错误电子邮件,并有一个非常流畅的界面用于导航回溯。
-
但是对于这个问题,您可以做的最简单和最快的事情是在您的 heroku django 服务器设置中设置 DEBUG = True,这样您就可以在浏览器窗口中获得回溯。现在通过浏览器而不是 AJAX 发出请求,您应该得到 500 错误的回溯。完成此操作后更新您的问题。
-
目前您正在通过 ajax 调用 url。要直接通过浏览器访问该网址,请在浏览器栏中输入网址(
hostayni.herokuapp.com/api/post?q=而不是hostayni.herokuapp.com/post/)。 -
@rawbeans 我已经序列化了一个字段,默认情况下它不能被 Django Rest Framework 序列化。然后,浏览器显示这个错误:
TypeError at /api/post/ Country(code='') is not JSON serializable.