Django i18n_模式如何防止非活动语言的前缀

2024-06-18 11:23:57 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的django设置.py文件,我有六种活动语言:

LANGUAGES = (
('de', gettext_noop('German')),
('en', gettext_noop('English')),
('es', gettext_noop('Spanish')),
('fr', gettext_noop('French')),
('nl', gettext_noop('Dutch')),
('pt', gettext_noop('Portuguese')),
)

使用i18n模式时,这些页面非常有用:

^{pr2}$

但是,如果你在谷歌搜索我的网站,你会看到多个页面的语言前缀。有些是我不支持的语言。其中有些甚至不存在:

http://examble.com/ch/main
http://exmaple.com/zz/main
etc..

我不知道为什么这些页面被编入索引。他们不在我的网站地图上。然而,Django确实将它们作为页面使用。在

问题是,修改i18n_模式以使其只允许有效的、活动的语言的最佳方法是什么设置.py?我想所有其他2字符前缀404。在


Tags: 文件djangopycom语言http网站main
2条回答

这不是一个直接的解决办法,但可能会帮助你或指出一个好的解决办法。在

  • 定制中间件呢?

我们有两种选择:

  1. 一个中间件,您可以在其中检查用户的国家/地区并重定向到您允许的国家/地区(如果不允许用户国家/地区,则可以重定向到自定义url或显示404错误)

  2. 一个中间件,您可以在其中检查客户机的url路径,因此您将拥有/country_code/url并且可以执行上述操作,如果不允许路径,则可以重定向到自定义url或显示404错误

小例子:

1。检查国家的中间件

pygeoIP在示例中使用,以按ip获取国家/地区

import pygeoip

class CountryMiddleware:
    def process_request(self, request):
        allowed_countries = ['GB','ES', 'FR']  # Add your allowed countries
        gi = pygeoip.GeoIP('/usr/share/GeoIP/GeoIP.dat', pygeoip.MEMORY_CACHE)
        ip = request.META.get('REMOTE_ADDR')
        user_country = gi.country_code_by_addr(ip)

        if user_country not in allowed_countries:
            return HttpResponse... # Here you decide what to do if the url is not allowed
            # Show 404 error
            # or Redirect to other page... 

2。一个检查url的中间件

^{pr2}$

如果您决定使用这些选项,您必须记住:

  • 您需要在路径your_project/middleware/middlewarefile.py中添加中间件文件
  • 你需要在你的设置.py公司名称:

    中间件类=(

    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # etc.....
    'yourproject.middleware.domainmiddleware.DomainMiddleware',
    

  • 我在这里展示的代码还没有完成或测试,它只是帮助您找到一个好的解决方案的方向

最好的解决方案(我知道)是使用solid-i18n-urls。在

安装软件包:

pip install solid_i18n

稍微修改一下设置:

^{pr2}$

使用实线模式代替i18n模式

from django.conf.urls import patterns, include, url
from solid_i18n.urls import solid_i18n_patterns

urlpatterns = solid_i18n_patterns('',
    url(r'^main/$', 'about.view', name='about'),
)

现在,如果转到example.com/en/main,它工作得很好,因为en是在语言linst中指定的,但是如果转到example.com/ch/main,则会抛出404页未找到错误。在

相关问题 更多 >