gpt4 book ai didi

django - 在子文件夹上托管 Django

转载 作者:行者123 更新时间:2023-12-01 13:27:08 26 4
gpt4 key购买 nike

我已经使用 Gunicorn 和 NGINX 部署了 Django,并且它工作正常,如果 Django 应用程序在根 url 上提供,使用以下配置:

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 告诉我它找不到 View 。

这是 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 站点时,我喜欢使用动态配置,以便您仍然可以直接访问机器(没有代理)并拥有一个有效的网络应用程序。这可以帮助很多调试棘手的东西,这些东西很难在开发中重现。
如果你没有能力传递header或者修改wsgi.py,你仍然可以设置 FORCE_SCRIPT_NAME 在您的 Django 设置中。
3个步骤:

  • 在网络服务器前面设置一个代理,将子文件夹从 URL
  • 中剥离出来
  • 设置 X-Script-Name标题,以便您的 Django 站点使用 /myapp/ 生成其 url在他们面前——确保你使用的是 {% url %}标签和 reverse ,与硬编码!
  • 修改 myapp/wsgi.py 以将新的头文件 X-Script-Name 读入 wsgi 环境变量 SCRIPT_NAME (基于 this flask snippet)

  • 这是一个代理的 Nginx 配置示例,它指向子目录中的 Django 站点并设置 X-Script-Name(步骤 1 和 2),请注意,这不使用 unix 套接字,因此它与OP的问题。欢迎编辑:
    配置文件
    location /my_app {
    proxy_pass https://mywebapp.com/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Script-Name /my_app;
    proxy_cookie_path / /my_app;
    }
    并阅读 X-Script-Name:
    我的应用程序/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)

    关于django - 在子文件夹上托管 Django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47941075/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com