Django localeURL与WSGIScriptAlias为/PREFIX时

8 投票
2 回答
1943 浏览
提问于 2025-04-15 23:39

介绍

我有个关于localeURL使用的问题。对于像这样的链接,我的一切都运行得很好:http://www.example.com/

  • 如果我在地址栏输入http://www.example.com/,它会正确地变成http://www.example.com/en/,比如说。

  • 如果我使用视图change_locale,也没问题(也就是说,把www.example.com/en/换成www.example.com/fr/)。

问题

但是我的应用程序使用apache作为服务器,并且使用mod_wsgi。httpd.conf脚本里有这一行:

WSGIScriptAlias /MY_PREFIX /path/to/django/app/apache/django.wsgi

这会生成像这样的链接:
http://www.example.com/MY_PREFIX/

在change_locale视图中也出现了同样的问题。我修改了这段代码,以便处理这个前缀(存储在settings.SERVER_PREFIX中):

    def change_locale(request) :
    """
    Redirect to a given url while changing the locale in the path
    The url and the locale code need to be specified in the
    request parameters.
    O. Rochaix; Taken from localeURL view, and tuned to manage :            
        - SERVER_PREFIX from settings.py
    """
    next = request.REQUEST.get('next', None)
    if not next:
        next = request.META.get('HTTP_REFERER', None)
    if not next:
        next = settings.SERVER_PREFIX + '/'

    next = urlsplit(next).path

    prefix = False
    if settings.SERVER_PREFIX!="" and next.startswith(settings.SERVER_PREFIX) :
        prefix = True
        next = "/" + next.lstrip(settings.SERVER_PREFIX) 

    _, path = utils.strip_path (next)

    if request.method == 'POST':
        locale = request.POST.get('locale', None)
        if locale and check_for_language(locale):
            path = utils.locale_path(path, locale)

    if prefix :
        path = settings.SERVER_PREFIX + path

    response = http.HttpResponseRedirect(path)
    return response

通过这个自定义视图,我能够正确地切换语言,但我不确定这样做是否正确。

问题

  1. 在httpd.conf中使用WSGIScriptAlias和/PREFIX(比如说"/Blog")时,我们在Python端是否需要使用一个与WSGIScriptAlias匹配的变量(这里是settings.SERVER_PREFIX)?我在MEDIA_URL和其他地方使用了它,但也许有一些配置可以让它“自动”工作,而不需要在Python端处理。

  2. 你认为这个自定义视图(change_locale)是解决这个问题的正确方法吗?还是说像第1个问题那样有一些自动化的东西?

  3. 如果我在地址栏输入地址(http://www.example.com/MY_PREFIX/),这并不能解决问题。如果自定义是解决方案,我也会进行更改,但我觉得还有更好的解决办法!

2 个回答

0

试试这个(我不确定它是否有效):

WSGIScriptAliasMatch ^/MY_PREFIX(/.*)?$ /path/to/django/app/apache/django.wsgi$1
基本上,这个想法是让Django认为没有前缀。

但你需要确保Django在它的HTML输出中生成正确的URL。

3

你不应该在设置中直接写死 SERVER_PREFIX。网站的挂载前缀可以通过 WSGI 环境字典中的 SCRIPT_NAME 来获取。因此,你可以通过 request.META.get('SCRIPT_NAME') 来获取这个值。

撰写回答