return 生产环境下使用nginx时Django项目报错的方法
How to return Django project's error messages when I use nginx in production mode
我已经开发了 Django 项目并将其部署到 Amazon 的免费层 EC2 服务。除了未 return 返回的错误消息外,一切都很好。我在生产模式下使用该项目。
上图的解释[控制台日志]:
成功的请求和响应 - 它是针对现有的 url
第二次请求是故意向不存在的 url 发出的,但没有收到任何响应。
我希望至少获得 404 响应,我遇到的问题是没有来自服务器的任何响应。当我 运行 它在服务器上时,我看到它正在将结果记录到服务器。
问题:
如何 return 当出现问题时 Django 生成的响应。
额外信息:这些错误消息和响应是在 djangorestframework's
内置模板中生成的。
额外的细节:
如果我遗漏了什么,请告诉我。
你是代理传递请求,他们没有得到正确的add_header,你应该在添加headers
后代理传递
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PATCH, PUT, DELETE';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PATCH, PUT, DELETE';
#
# Custom headers and headers various browsers *should* be OK with but aren't
#
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range, Authorization';
#
# Tell client that this pre-flight info is valid for 20 days
#
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
proxy_pass http://app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
另一种方法是将 django-cors-headers 添加到您的应用程序中
大脑在累的时候会做一些有趣的事情。感谢@iklinac。他是对的,我会更好地使用 django-cors-headers
正确。它已经安装并在 heroku 上运行,当我搬到 amazon aws 时,我认为任何事情都与 NGINX 有关。
注意事项。
pip 安装 django-cors-headers
确保它在您安装的应用程序中。
INSTALLED_APPS = [
...
'corsheaders',
...
]
- 您还需要添加一个中间件 class 来监听响应:# 我错过了
MIDDLEWARE = [ # Or MIDDLEWARE_CLASSES on Django < 1.10
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
- 授权进行跨站点 HTTP 请求的来源列表
CORS_ORIGIN_WHITELIST = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8080",
"http://127.0.0.1:9000"
]
然后您可以根据需要调整和使用其他一些东西。
最后我把我的nginx.conf改成了关注
upstream hello_django {
server web:8000;
}
server {
listen 80;
location / {
proxy_pass http://hello_django;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /staticfiles/ {
alias /home/app/web/staticfiles/;
}
location /mediafiles/ {
alias /home/app/web/mediafiles/;
}
}
编码愉快。)
归功于 testdriven.io and django-cors-headers
我已经开发了 Django 项目并将其部署到 Amazon 的免费层 EC2 服务。除了未 return 返回的错误消息外,一切都很好。我在生产模式下使用该项目。
上图的解释[控制台日志]:
成功的请求和响应 - 它是针对现有的 url
第二次请求是故意向不存在的 url 发出的,但没有收到任何响应。
我希望至少获得 404 响应,我遇到的问题是没有来自服务器的任何响应。当我 运行 它在服务器上时,我看到它正在将结果记录到服务器。
问题:
如何 return 当出现问题时 Django 生成的响应。
额外信息:这些错误消息和响应是在 djangorestframework's
内置模板中生成的。
额外的细节:
如果我遗漏了什么,请告诉我。
你是代理传递请求,他们没有得到正确的add_header,你应该在添加headers
后代理传递location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PATCH, PUT, DELETE';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PATCH, PUT, DELETE';
#
# Custom headers and headers various browsers *should* be OK with but aren't
#
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range, Authorization';
#
# Tell client that this pre-flight info is valid for 20 days
#
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
proxy_pass http://app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
另一种方法是将 django-cors-headers 添加到您的应用程序中
大脑在累的时候会做一些有趣的事情。感谢@iklinac。他是对的,我会更好地使用 django-cors-headers
正确。它已经安装并在 heroku 上运行,当我搬到 amazon aws 时,我认为任何事情都与 NGINX 有关。
注意事项。
pip 安装 django-cors-headers
确保它在您安装的应用程序中。
INSTALLED_APPS = [
...
'corsheaders',
...
]
- 您还需要添加一个中间件 class 来监听响应:# 我错过了
MIDDLEWARE = [ # Or MIDDLEWARE_CLASSES on Django < 1.10
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
- 授权进行跨站点 HTTP 请求的来源列表
CORS_ORIGIN_WHITELIST = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8080",
"http://127.0.0.1:9000"
]
然后您可以根据需要调整和使用其他一些东西。
最后我把我的nginx.conf改成了关注
upstream hello_django {
server web:8000;
}
server {
listen 80;
location / {
proxy_pass http://hello_django;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /staticfiles/ {
alias /home/app/web/staticfiles/;
}
location /mediafiles/ {
alias /home/app/web/mediafiles/;
}
}
编码愉快。) 归功于 testdriven.io and django-cors-headers