zoukankan      html  css  js  c++  java
  • 45、django工程(URLconf)


    45.1、django URLconf 路由系统介绍:

    1、说明:

    URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表,

    你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。


    2、代码格式:

    (1)格式:

    from django.contrib import admin

    from django.conf.urls import url,include

    from app01 import views

    urlpatterns = [

    url(正则表达式, views视图函数, 参数, 别名),

    ]


    (2)参数说明:

    一个正则表达式字符串

    一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串

    可选的要传递给视图函数的默认参数(字典形式)

    一个可选的name参数


    45.2、URLconf 基本配置示例:

    1、urls.py 文件配置:

    from django.contrib import admin

    from django.conf.urls import url,include

    from app01 import views


    urlpatterns = [

    url(r'^articles/2003/$', views.special_case_2003),

    #完全匹配

    #def special_case_2003(request):

    url(r'^articles/[0-9]{4}/$', views.year_archive, {'year':'2020'}),

    #匹配任意四个数字及自定义参数传递(后台参数接收名称必须和传入参数名称保持一致)

    #year_archive(request,year):

    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.year_month_archive),

    #无名分组,后台参数接收名称不必和传入参数名称保持一致

    #year_month_archive(request,y,m):

    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),

    #有名分组,后台参数接收名称必须和传入参数名称保持一致

    #def article_detail(request,year,month,day):

    ]


    2、settings.py APPEND_SLASH参数说明:

    (1)Django settings.py 配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为

    APPEND_SLASH = True。

    1)APPEND_SLASH = True 的情况下:

    先会根据前端传来的url,先检测这个 url 能不能访问资源,如果可以访问的话,那么就去执行相应的业务代

    码,最后返回。如果这个 url 不能访问到资源的话,会判断这个 url 最后有没有"/",有"/"的话,则返回 404

    错误,如果没有 "/" 的话,便会帮你加上"/",生成一个新的 url,再去检测这个新的 url 能不能访问到资源,

    如果能访问的话,则返回 301 的状态码,并将这个新的 url 传到前端,进行重定向操作,如果这个新的 url

    还是不能访问到资源的话,也会返回 404 错误。

    小结:如果请求 URL 与 URLconf 中的任何模式都不匹配,则会将 HTTP 重定向发送到同一网址并附加斜杠。

    重定向可能导致 POST 请求中提交的所有数据丢失,所以在调用 url 时,是否要加"/",与 URLconf 要保持

    一致,如果不想要 url 后面的"/",可以在 URLconf 中定义成 "r'^<字符>$'" 完全匹配的形式。

    2)APPEND_SLASH=False 的情况下(需要清下浏览器的缓存):

    django 不会自动帮你在 url 后面加"/",你前台传怎样的 url,那就用这个 url 去访问资源,能不能访问还得

    看你 url 对不对。


    (2)示例:

    1)如下URL视图:

    from django.conf.urls import url,include

    from app01 import views


    urlpatterns = [

    url(r'^hello/$', views.hello),

    ]

    2)因定义了 hello/ 结尾,所以:

    http://127.0.0.1:8080/hello

    会自动转到

    http://127.0.0.1:8080/hello/

    3)当 settings.py 设置为 APPEND_SLASH = False 时:

    访问 http://127.0.0.1/hello 将会返回 404。


    (3)补充:url 的匹配规则:

    url 和 URLconf 的匹配是从上往下的惰性匹配,如果 url 和 URLconf 中的一个资源匹配成功,

    就不会往下再匹配了

    例如:用 http://127.0.0.1:8080/articles/2003/、http://127.0.0.1:8080/articles/2003/1/

    去匹配下面两个资源,结果都是匹配第一个资源,为了避免这种情况,在 URLconf 中定义成

    "r'^articles/2003/$'"、"r'^articles/2003/1/$'" 的形式进行 url 的完全匹配。

    -------------------------------------------------------------------------------------------------------------

    url(r'^articles/2003/', views.special_case_2003),

    url(r'^articles/2003/1/', views.year_archive),


    45.3、URLconf 别名:

    1、主要由项目内部模板文件调用。使用 URLconf 别名的好处是:为了 URLconf 的更改不会影响前端

    的引入,避免造成前端大量修改。


    2、示例:

    (1)urls.py:

    from django.conf.urls import url,include

    from app01 import views


    urlpatterns = [

    url(r'^login/$', views.login, name='login_alias'),

    url(r'^index/$', views.index),

    ]


    (2)views.py:

    from django.shortcuts import render,HttpResponse,redirect


    def login(request):

    if request.method == 'POST':

    name = request.POST.get('username')

    pwd = request.POST.get('pwd')

    if name =='root' and pwd == "123456":

    return redirect("/index/")

    #重定向,是一个url地址,完整的格式为 http://127.0.0.1:8080/inedx/,

    #当前为缩写,浏览器上显示的 URL 不再是开始时请求的那个 URL了。


    return render(request,'login.html')

    #render 返回的是 templates 目录下的经 django 渲染的 html 页面,浏览器上显示

    #的 url 地址不会改变。


    def index(request):

    return HttpResponse('login success! This is index.html')


    #1、login 函数的逻辑为,对用户的访问判断是 get 请求还是 post 请求。

    #2、用户打开登录界面时为 get 请求返回 login.html 登录页面。

    #3、用户输入用户名和密码进行提交是 post 请求,如果用户名和密码验证成功重定向到 URLconf

    #中的 url(r'^index/$', views.index), 用户浏览器 URL 地址发生改变,如果用户名和密码

    #验证失败则返回登录 login.html 页面,用户浏览器的 URL 地址不发生改变。


    (3)login.html (使用别名):

    <!DOCTYPE html>

    <html lang="en">

    <head>

    <meta charset="UTF-8">

    <title>Title</title>

    </head>

    <body>

    <form action="{% url 'login_alias' %}" method="post">

    {% comment %}

    调用 url 别名,不使用别名的方式是 action="/login/"

    /login/:表示的是一个 url 地址,django会自动在最左边的

    斜杠前加上当前项目的绑定的ip地址和端口号,变成

    http://127.0.0.1:8080/login/ 的形式,其中 login/ 代表

    的是 URLconf 中配置的 r'^login/$' 资源地址。

    {% endcomment %}

    {% csrf_token %}

    {#解决表单 post 请求 csrf 验证报错问题#}

    <div><input type="text" name="username"></div>

    <div><input type="password" name="pwd"></div>

    <div><input type="submit" value="submit"></div>

    </form>

    </body>

    </html>


    45.4、包括其它 URLconf 的 URLconf配置(url 路由分发):

    1、说明:

    该配置需要在项目不同的应用程序下创建 urls.py,在主 urls.py 文

    件中配置分发设置。好处是防止所有的 URLconf 都配置在主

    urls.py 一个文件中,方便开发人员进行维护,避免因一个

    URLconf 配置错误而导致所有的项目应用程序都无法使用。


    2、示例:

    (1)在项目应用程序 app01 下创建 urls.py 文件。


    (2)主 urls.py 配置:

    from django.conf.urls import url,include


    urlpatterns = [

    url(r'^blog/', include('app01.urls')),

    ]


    (3)应用程序 app01 下的 urls.py 配置:

    from django.conf.urls import url

    from app01 import views


    urlpatterns = [

    url(r'^index/$', views.index),

    ]


    3、补充:

    为避免所有的视图函数都写在项目应用程序下 views.py 一个文件中不好维护,应该在

    项目下每个应用程序文件夹下创建一个 views 目录来存放应用程序因需求不同所用视

    图函数的 .py 文件,在 urls.py 中调用视图函数时只要用

    from <项目应用程序名>.<存放视图函数的 .py 文件的目录> import <存放视图函数的 .py文件>。







  • 相关阅读:
    二项式反演
    快速沃尔什变换
    springMVC的form标签
    springMVC的拦截器配置
    RESTful使用方法
    springMVC数据绑定
    使用spring框架自带的字符拦截器
    将idea中的项目上传至github
    springMVC的使用方式
    springMVC的概述
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/12320658.html
Copyright © 2011-2022 走看看