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,那么百度会默认以为是静态网页,收入到数据库中,这样是你的网页可能比其他网页先匹配到。
  • 相关阅读:
    AS将一个项目导入到另一个项目中
    Android Studio出现:Cause: unable to find valid certification path to requested target
    小米手机Toast带app名称
    PopupWindow 点击外部区域无法关闭的问题
    EditText inputType类型整理
    Fragment通过接口回调向父Activity传值
    Android selector一些坑
    Installation failed with message Failed to commit install session 634765663 with command cmd package
    旷视上海研究院机器人方向招聘
    语义SLAM的数据关联和语义定位(四)多目标测量概率模型
  • 原文地址:https://www.cnblogs.com/zhuchunyu/p/9923272.html
Copyright © 2011-2022 走看看