Python Django不区分大小写的URL?

Python Django不区分大小写的URL?,python,django,Python,Django,默认情况下,django的url解算器执行区分大小写的搜索来解算url,并区分“/Login”和“Login”。我的url模式如下 urlpatterns = patterns('', (r'^admin/(.*)', admin.site.root), (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_DOC_ROOT,

默认情况下,django的url解算器执行区分大小写的搜索来解算url,并区分“/Login”和“Login”。我的url模式如下

urlpatterns = patterns('',
    (r'^admin/(.*)', admin.site.root),
    (r'^static/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': settings.STATIC_DOC_ROOT, 'show_indexes': True}),
    (r'^login/$', 'django.contrib.auth.views.login'),
    (r'^logout/$', do_logout),
)
urlpatterns=patterns(“”,
(r“^admin/(.*),admin.site.root),
(r'^static/(?P.*)$,'django.views.static.service',
{'document_root':settings.STATIC_DOC_root,'show_index':True}),
(r“^login/$”、“django.contrib.auth.views.login”),
(r“^logout/$”,请勿注销),
)
有谁能告诉我,如何使django URL不区分大小写吗?

只需在每个
r'.'
字符串的开头添加
(?i)
,即:

urlpatterns = patterns('',
(r'^(?i)admin/(.*)', admin.site.root),
(r'^(?i)static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root': settings.STATIC_DOC_ROOT, 'show_indexes': True}),
(r'^(?i)login/$', 'django.contrib.auth.views.login'),
(r'^(?i)logout/$', do_logout),
)
urlpatterns=patterns(“”,
(r'^(?i)admin/(.*),admin.site.root),
(r'^(?i)static/(?P.*)$,'django.views.static.service',
{'document_root':settings.STATIC_DOC_root,'show_index':True}),
(r'^(?i)login/$,'django.contrib.auth.views.login'),
(r'^(?i)注销/$,不注销),
)
告诉每一个RE都要毫无意识地匹配案例——当然,还要从此过上幸福的生活!)

对于Django 2.0(于2017年12月发布),使用正则表达式进行URL匹配的推荐方法是现在取代
URL

from django.urls import path, re_path
from . import views

urlpatterns = [   
    re_path(r'^(?i)admin/(.*)', admin.site.root),
    re_path(r'^(?i)something/(?P<somestring>\w+)/$', views.something),
    re_path(r'^(?i)login/$', views.login),
    re_path(r'^(?i)logout/$', views.logout),
]
从django.url导入路径,重新设置路径
从…起导入视图
urlpatterns=[
re_路径(r'^(?i)admin/(.*),admin.site.root),
re_path(r'^(?i)something/(?P\w+/$),views.something),
re_路径(r'^(?i)login/$,views.login),
re_路径(r'^(?i)logout/$,views.logout),
]

在Django 2.1中,似乎将
(?i)
放在URL正则表达式中的任何位置都会导致它忽略大小写。但是,
reverse()
会失败,除非正则表达式末尾的
(?i)
跟在
$
后面

from django.urls import re_path, reverse
from django.shortcuts import render

def home_page(request):
    foo = reverse('home_page')
    return render(request, 'home.html')

urlpatterns = [ re_path(r'home/(?i)', home_page, name='home_page') ]
提高

ValueError: Non-reversible reg-exp portion: '(?i'

但是使用regex
r'home/$(?i)

可以干净地运行,您也可以从自己的视图中管理它。例如,如果您有一个generic.DetailView,您可以覆盖get\u queryset方法,并将slug值设置为小写:

models.py:

from django.db import models
from django.utils.text import slugify


class MyModel(models.Model):
    """MyModel

    """  
    # name attribute is used to generate slug
    name = models.CharField(max_length=25, verbose_name='Name', unique=True)

    slug = models.SlugField(unique=True, verbose_name='Slug')

    # override save method to generate slug
    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        self.slug = slugify(self.name)
        super(MyModel, self).save(force_insert=False, force_update=force_update, using=using, update_fields=update_fields)


views.py:

from django.views import generic


class MyModelDetailView(generic.DetailView):
    """MyModelDetailView

        Detail view of MyObject.
    """

    model = MyModel
    template_name = 'my_models/my_model_detail.html'

    def get_queryset(self):
        try:
            self.kwargs['slug'] = self.kwargs['slug'].lower()
        except Exception as err:
            print(err)
            pass

        queryset = self.model.objects.filter()
        return queryset

URL.py:

from . import views
from django.conf.urls import url

    url(r'^my_model_detail/(?P<slug>[-\w]+)/$', views.MyModelDetailView.as_view(),
        name='my_model_detail'),
来自。导入视图
从django.conf.url导入url
url(r'^my_model_detail/(?P[-\w]+)/$),views.MyModelDetailView.as_view(),
name='my_model_detail'),
Django 2.2更新 根据:

Django 1.11中不推荐在正则表达式组((?i),(?L),(?m),(?s)和(?u))中支持内联标志,而在Django 2.1中删除了这些标志

在Django 2.2中,将
(?i)
添加到模式的开头会产生此异常:

ValueError:不可逆的reg exp部分

令人困惑的是,将其添加到末尾会产生以下警告:

弃用警告:标记不在表达式开头

在Django中处理不区分大小写的URL需要使用

FWIW,该票证还建议“不区分大小写的URL不是一个好的做法”,但是它没有对此提供更多的论证


PyPi上有一个名为的包,看起来是个不错的选择

它起作用了。。。。非常感谢你。。。你能给我推荐一些使用python学习正则表达式的好资源吗?如果你需要免费的啤酒信息;用于Python特定信息;如果你能负担得起投资(好书!-)。此外,由于(?i)是一个常规的快速标志,它不必在插入符号之后。例如,
(r'(?i)^logout/$,do_logout),
也可以工作,对某些人来说可能更容易阅读。express中可以使用的其他正则表达式标志是'L',m','s','u','x',正如在@ChrisFreeman的(?iLmusx)中所讨论的那样。@ChrisFreeman这实际上不是完全相同的事情——在我的项目中,当我使用
r'(?i)时,它按名称中断了反向url查找^foo/$”
这在django 2.0之后无法运行,并生成ValueError:Non reversible reg exp Part:“(?我在从django 1.*升级到2.*时遇到此问题。干杯!