在子文件夹上托管Django

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

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

server {
    listen 80;

    location = /favicon.ico { access_log off; log_not_found off; }

    location / {
        include proxy_params;
        proxy_pass http://unix:my_app.sock;
    }
}

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

这是Nginx配置:

server {
    listen 80;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /my_app {
        include proxy_params;
        proxy_pass http://unix:/var/my_app/app.sock;
    }
}

我该如何进行这项工作?到目前为止,我找不到任何解决方案来指定类似“ 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

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

并读取X-Script-Name:

myapp / wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE","myapp.settings")

_application = get_wsgi_application()


def application(environ,start_response):
    # http://flask.pocoo.org/snippets/35/
    script_name = environ.get('HTTP_X_SCRIPT_NAME','')
    if script_name:
        environ['SCRIPT_NAME'] = script_name
        path_info = environ['PATH_INFO']
        if path_info.startswith(script_name):
            environ['PATH_INFO'] = path_info[len(script_name):]

    scheme = environ.get('HTTP_X_SCHEME','')
    if scheme:
        environ['wsgi.url_scheme'] = scheme

    return _application(environ,start_response)

猜你在找的Nginx相关文章