【问题标题】:Access to the requested URL within a Django handler404 redirection?在 Django handler404 重定向中访问请求的 URL?
【发布时间】:2019-08-25 02:51:30
【问题描述】:

我确信这有一个非常简单的答案,但我在 Google 和 Stack Overflow 上花了几个小时没有找到任何答案。

我正在为多语言网站构建 Django CMS。 URL 采用以下形式:

https://example.com/xx/subject

其中 x 是一种语言的两个字母代码(en=English,fr=French)。例如:

https://example.com/en/about-us
https://example.com/fr/a-propos

我需要能够从 handler404 视图中访问请求的 URL,以便为访问者提供适当的内容。

我目前在 Django 应用中有一个有效的 404 重定向:

project.urls.py

handler404 = 'myapp.views.error404'

myapp.views.py

def PageView(request, lang, subject):
    [creates a page with DB content based on lang & subject]

def error404(request, *args, **kwargs):
    return PageView(request,'en','404page',)

我想知道请求的 URL 是什么,以便将访问者重定向到以他们的语言显示的页面。

在此系统下,404 页面将是 CMS 中的任何其他页面,因此 CMS 用户可以对其进行编辑(我没有使用 Django 模板来创建页面)。

每种语言的数据库中都会有一个“404page”条目。

这是我正在寻找的那种东西的非工作示例:

def error404(request, *args, **kwargs):
    lang = args[0]
    subject = args[1]
    if lang = 'fr':
        return PageView(request,'fr','error404',)
    else:
        return PageView(request,'en','error404',)

如果有人请求 example.com/fr/quelque-chose,我想向他们展示来自 fr/404Page 的内容。

如果有人请求 example.com/mlkqdjsfexample.com/en/not-a-page,我想向他们展示来自 en/ 的内容404页

在这两种情况下,我都将使用 PageView 视图来构建常规网站页面。

【问题讨论】:

  • 你知道request.path吗?

标签: django view http-status-code-404 handler


【解决方案1】:

我认为你可以使用request.path

def error404(request, *args, **kwargs):
    lang = request.path.split('/')[1]
    if lang = 'fr':
        return PageView(request,'fr','error404',)
    else:
        return PageView(request,'en','error404',)

【讨论】:

    【解决方案2】:

    如果你只对语言感兴趣,可以使用get_language_from_request函数:

    from django.utils import translation
    
    def error404(request, *args, **kwargs):
        language = translation.get_language_from_request(request, check_path=True)
        return PageView(request, language, 'error404')
    

    check_path 参数是首先检查 URL 是否以语言代码开头,我认为这是您想要的。

    查看有关get_language_from_request 和其他翻译相关功能的django 文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      相关资源
      最近更新 更多