53.django路由层的简单配置及反向解析

0.上节关键命令

  创建一个Django项目:django-admin  startproject  projectname

  创建一个项目下的应用:python3  manage.py  startapp  appname

  运行:python3  manage.py  runserver  (IP PORT)

1.url配置(URLconf)

  功能:建立起url与视图函数的映射关系。通过这种方式告诉django,客户端发来的某个url调用哪一段逻辑代码对应执行

  基本语法:url(正则表达式规则,视图函数)

  url下的path是django2.0的语法,re_path属于1.0的语法,目前2.0也兼容这种语法,导入即可

url部分

urlpatterns = [
    # 用户在url中输入127.0.0.1:8000/articles/2003/,可以直接调用函数
    url(r'^articles/2003/$', views.special_case_2003),
    # 利用优先匹配,获取用户输入年月
    url("^articles/(\d{4})/(\d{2})/$", views.article_month),
    # 什么都不写也会默认访问这一个index视图,这个也很重要
    url(r'^$', views.index),
]

views部分

from django.shortcuts import render,HttpResponse,redirect
from django.urls import reverse

# Create your views here.

def special_case_2003(request):
    return HttpResponse('get it')

def article_month(request,year,month):
    print(year, type(year))
    print(month, type(month))
    return HttpResponse(year + ":" + month)

def index(request):
    return HttpResponse('首页默认显示')

注:

  若要在url中捕获一个值,只需要在他周围防止一对圆括号,如上例

  不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles

  每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义

1.2有名分组

  上面简单配置只是通过简单配置来捕获URL中的值,并通过位置参数传给视图,可以使用命名的正则表达式组来捕获URL 中的值并以关键字参数传递给视图

url部分

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

# 有名分组
urlpatterns = [
    url("^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$",views.article_day) 
# article_year(request,year=2000,month=12,day=12)
]

views部分

from django.shortcuts import render,HttpResponse,redirect
from django.urls import reverse

# 这里形参无论怎么放置都无所谓了
def article_day(request,month,day,year):
    return HttpResponse(year + "-" + month + "-" + day)

1.3 分发

   首先需要引入一个函数include(看urls.py下的注释),当你存在多个app的时候,彼此互不影响,各自从各自的app中去查找,好处是用于解耦

from django.urls import path,include

urlpatterns = [ 
        path('app01/',include("app01.urls")),
        path('app02/',include("app02.urls")),
]

1.4 反向解析(重要的一个功能)

  url下的名字由于业务需求领导要求变更,这意味用到该路径的地方都需要更改,模板中用到这个名字的地方都需要改,一个项目中可能包含几十个模板文件,此时意味着维护起来代价相当高,此时则引入了反向解析这种语法,通过使用别名name来提高代码的灵活性。

url部分(不管怎么变动,我们只需更改这里的url部分即可,大大减少了工作量)

from django.urls import path
from app import views

urlpatterns = [
    path("login/", views.login, name="log_in"),
    path("index/", views.index, name="index"),
]

视图部分

from django.shortcuts import render,HttpResponse,redirect
from django.urls import reverse   # 导入反向解析的一个函数

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user=='bob' and pwd=='123':
            # 登录成功后直接跳转到首页index,即重定向,
            # 不过下面这样写就又被写死了,如果url中一改这里也需要改动
            # 现在也需要通过在url下使用别名
            # return redirect("index")   # 硬编码
            url = reverse("index")    # 反向解析
            print("url", url)    # url /index/
            return redirect(url)
    return render(request,"login.html")


def index(request):
    return HttpResponse('跳转成功')

模板部分(login.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#注意这里内容必须要放在form表单里,否则无法实现跳转#}
<form {% url 'log_in' %} method="post">
    姓名:<input type="text" name="user">
    密码:<input type="password" name="pwd">
    <input type="submit">
</form>
</body>
</html>

注:

  思路其实通过以不变(别名name)应万变

  在模板(html文件)中:

      {% url ‘别名’ %}

  在视图函数(Python脚本)中:    

      from django.urls import reverse
      url=reverse(别名)

猜你喜欢

转载自www.cnblogs.com/LearningOnline/p/9216876.html