zoukankan      html  css  js  c++  java
  • 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,那么百度会默认以为是静态网页,收入到数据库中,这样是你的网页可能比其他网页先匹配到。
  • 相关阅读:
    根据数据类型选择特征 select_dtypes(include=[]/exclude=[])
    quantile()
    concat()、merge()的区别
    json.dumps()和json.loads()
    Linux-top命令详解
    性能测试总结(一)---基础理论篇
    jmeter-常见问题及解决方法
    Jmeter之Bean shell使用(五)
    Jmeter-内存溢出原因及解决方法
    JMeter- JDBC Request
  • 原文地址:https://www.cnblogs.com/zhuchunyu/p/9923272.html
Copyright © 2011-2022 走看看