django-路由层

路由层(就时urls文件,那里配置一些列的路由和视图函数对应关系):
urlpatterns = [
url(r'^admin/',admin.site.urls),
]

1、简单路由配置
       这里的url其实就是一个函数,第一个参数就传入一个正则表达式,第二个参数传入对应的视图函数
       url(r'^user_list/',views.user_list),

2、无名分组
       url(r'^user_list/([0-9]{4})',views.user_list),
       主要是第一个参数就行改动,前面说了第一个参数传一个正则表达式,我们可以把自己想要的数据进行分组,然后
       作为参数传入后面的视图函数中,所以在视图函数中记得接收传送过去的参数。就以上面的路由为例,那我视图该怎么写呢?
       def user_list(request,year):
            print(year)
            return HttpResponse('zhuyu')
       这里视图函数中接收了那个参数,在路由层,一个路由分了几个组,视图函数记得接收相应的参数。还有就是这是位置传参,
       所以接收的时候,也是按位置接收。
       def user_list(request,*args):
            pass
       这样写也是可以的!
3、有名分组
       url(r'^user_list/(?P<year>[0-9]{4})',views.user_list),
       这里就是进行有名分组,将得到得到的数据赋值给一个变量,然后以year=2018的格式作为参数传到视图函数中,这里
       同无名分组一样,视图函数那里记得接收传过来参数,但是参数名必须是year。
       def user_list(request,year):
            print(year)
            return HttpResponse('zhuyu')
       注意,这里的参数year一定要和urls那里的参数一样。
4、反向解析
       url(r'user/',views.user),
       url(r'^user_list/',views.user_list,name='zhuyu'),
       url函数有四个参数,其中有一个name,就是给该条路由关系定义个名字
       有什么用呢?
            在你的视图函数或你的模板里肯定会用到一些url,那么r'^user_list/'发生了变化,是不是你的项目里用到该url
            的地方是不是也要进行相应的改动,这样你的程序才会和之前一样。万一你的项目很大,很多地方用到该url,改起来
            岂不是非常麻烦呢。
       怎么用(分别在视图函数,模板中)
            有了上面的疑问,那url函数中的name参数的作用就起到了作用

            1、在视图函数中引用到反向解析
            from django.shortcuts import reverse   #先导入该函数reverse
            def user(request):
                url = reverse('zhuyu')
                print(url)  #打印下url看下是什么东西
                return redirect(url)

            def user_list(request):
                return HttpResponse('hello')
            这里这样写了之后,路由层里url怎么变动,都不会影响该视图函数的重定向

            2、在模板中引用到反向解析
            <a href="{% url 'zhuyu' %}">点击</a>

       假如是这种情况呢?
       url(r'user/',views.user),
       url(r'^user_list/([0-9]{4})',views.user_list,name='zhuyu'),
       还是老样子分别在视图函数和模板演示
            1、视图函数中
            def user(request):
                url = reverse('zhuyu',args=(2018,))
                print(url)
                return redirect(url)
            def user_list(request,year):
                return HttpResponse('hello')
            注意:args必须是一个元组形式
            2、模板中
            {% url 'zhuyu' 2018 %}
            注意:url其实也是一个函数,传参的方法就是参数之间空格就行

       那这种情况呢?
       url(r'user/',views.user),
       url(r'^user_list/(?<year>[0-9]{4})',views.user_list,name='zhuyu'),
            1、视图函数中
            def user(request):
                url = reverse('zhuyu',kwargs=(year=2018,))
                print(url)
                return redirect(url)
            def user_list(request,year):
                return HttpResponse('hello')
            2、模板中
            {% url 'zhuyu' year=2018 %}
5、路由分发
       ROOT_URLCONF = 'book.urls'
       假如都把路由与视图函数的关系全都写在一个文件里的话,这样你的文件就会特别乱。
       我们不是有app的概念嘛,一个请求的url进来,先去总路由去匹配,成功匹配的话,
       就继续将该路由分发那属于它app的urls路由关系映射中。
       大致简记下:
            你有两个app,一个app01,一个是app02,在这两个app一样也有一个路由和视图函数的关系
            首先请求的url进去总路由中匹配,如果是app01开头,就把该请求的url继续分发到app01中
            的路由关系中,进行匹配。
       写写代码吧,首先你要有两个app,里面创建一个文件,写路由关系,文件名一般为urls
       在你的总路由文件里,先要导入
       from django.conf.urls import url,include
       urlpatterns = [
            url(r'^app01/',include('app01.urls'))
            url(r'^app02/',include('app02.urls'))
        ]
        app02中urls配置
        from django.conf.urls import url
        from app02 import views
        urlpatterns = [
            url(r'^user/$',view.user)
            url(r'^user_list/$',view.user_list)
        ]

        在浏览器输入:128.0.0.1:8000/app02/user     就会匹配到相应的视图
6、名称空间
        名称空间一般和路由分发一起使用,之前不是有反向解析嘛,name='zhuyu',万一几个url都为name='zhuyu',
        那么我是用zhuyu到底是用时的是哪个就分不清楚了,所以名称空间就十分有必要的
        在include函数中,有个namespace参数,这就是给分发的路由设置个名字。
        我们给app02设置 namespace=app02
        1、视图函数中
            def user(request):
                url = reverse('app02:zhuyu',kwargs=(year=2018,))
                print(url)
                return redirect(url)
        2、模板中
            {% url 'app02:zhuyu' year=2018 %}
7、伪静态
        伪静态从名字来看:它是一个伪装的静态网页,那么就是一个多态网页了。
        你可以url写成html,那么百度会默认以为是静态网页,收入到数据库中,这样是你的网页可能比其他网页先匹配到。
原文地址:https://www.cnblogs.com/zhuchunyu/p/9923272.html