在子文件夹上托管Django

前端之家收集整理的这篇文章主要介绍了在子文件夹上托管Django 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我已经使用Gunicorn和Nginx部署了Django,并且如果使用以下配置将Django应用提供给根网址,则可以很好地工作:

  1. server {
  2. listen 80;
  3. location = /favicon.ico { access_log off; log_not_found off; }
  4. location / {
  5. include proxy_params;
  6. proxy_pass http://unix:my_app.sock;
  7. }
  8. }

但是,当我尝试在另一个URL上提供Django应用程序时,它不起作用.
如果我尝试访问http://domain/my_app/admin/,则Django告诉我找不到该视图.

这是Nginx配置:

  1. server {
  2. listen 80;
  3. location = /favicon.ico { access_log off; log_not_found off; }
  4. location /my_app {
  5. include proxy_params;
  6. proxy_pass http://unix:/var/my_app/app.sock;
  7. }
  8. }

我该如何进行这项工作?到目前为止,我找不到任何解决方案来指定类似“ BASE_URL”的内容.

最佳答案
我的评论并未显示全部内容.当我在子文件夹上运行Django站点时,我喜欢使用动态配置,以便您仍可以直接访问计算机(无需代理)并拥有可运行的Web应用程序.这可以帮助很多人调试难以在开发中重现的棘手内容.

如果您没有传递标头或修改wsgi.py的能力,仍可以在Django设置中设置FORCE_SCRIPT_NAME.

3个步骤:

>在网络服务器之前设置代理,以将子文件夹从URL中剥离
>设置X-Script-Name标头,以便您的Django站点使用/ myapp /开头生成其url-确保您使用的是{%url%}标签,并进行反向编码和硬编码!
>修改myapp / wsgi.py以将新的标头X-Script-Name读取到wsgi环境变量SCRIPT_NAME中(基于this flask snippet)

这是代理的Nginx配置示例,该配置指向子目录上的Django站点,并且还设置了X-Script-Name(步骤1和2),请注意,它不使用unix套接字,因此与OP的问题.欢迎编辑:

Nginx.conf

  1. location /my_app {
  2. rewrite ^/my_app/(.*)$/$1 break;
  3. proxy_pass https://mywebapp.com/$uri$is_args$args;
  4. proxy_set_header Host $host;
  5. proxy_set_header X-Script-Name /my_app;
  6. proxy_cookie_path / /my_app;
  7. }

并读取X-Script-Name:

myapp / wsgi.py

  1. import os
  2. from django.core.wsgi import get_wsgi_application
  3. os.environ.setdefault("DJANGO_SETTINGS_MODULE","myapp.settings")
  4. _application = get_wsgi_application()
  5. def application(environ,start_response):
  6. # http://flask.pocoo.org/snippets/35/
  7. script_name = environ.get('HTTP_X_SCRIPT_NAME','')
  8. if script_name:
  9. environ['SCRIPT_NAME'] = script_name
  10. path_info = environ['PATH_INFO']
  11. if path_info.startswith(script_name):
  12. environ['PATH_INFO'] = path_info[len(script_name):]
  13. scheme = environ.get('HTTP_X_SCHEME','')
  14. if scheme:
  15. environ['wsgi.url_scheme'] = scheme
  16. return _application(environ,start_response)

猜你在找的Nginx相关文章