2.urls路由

2.1urls路由使用示例

在项目目录中的urls文件中编写路由规则

from django.conf.urls import url
from django.contrib import admin
from app01 import views        #这一行为导入应用中的views文件(用于写业务逻辑)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$', views.index),    #这一行自定义一个访问路径
]



需要在urls文件中引入应用程序中的views

在应用程序中的views文件中编写业务逻辑

from django.shortcuts import render

# Create your views here.

def index(request):
    return render(request,'index.html')    #编写函数,返回index.html页面,函数中的request参数为默认写法,名称随意,render方法用于返回给view视图index.html文件,再由view视图返回给用户


自定义的函数中需要传入一个request参数,这个参数封装了所有的请求相关信息,这个request是一个对象  

视图中需要用到render()方法,render中需要用到request参数,并且返回templates目录下的html文件

为什么这里render方法中写一个html文件就能返回给用户呢,在项目下同名的目录中的settings配置文件中TEMPLATES一项(关于模版html文件的配置)
'DIRS': [os.path.join(BASE_DIR, 'templates')]

os.path.join(BASE_DIR,'templates')
BASE_DIR在开头import os处定义如下
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

__file__是当前文件
os.path.abspath当前文件绝对路径
os.path.dirname找到当前文件上层目录
两个os.path.dirname就找到了项目目录,因此BASE_DIR就是项目目录

再回头看'DIRS': [os.path.join(BASE_DIR, 'templates')]
BASE_DIR就是项目目录,和templates目录做了一个拼接,因此在render方法中直接写html文件就能找到 项目/templates/html文件

在templates目录下创建index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>第一次django使用</h1>
</body>
</html>


如果要想给用户返回一个html页面,需要在项目下的templates中编辑html文件

浏览器访问

iShot2020-10-16 14.19.39

这样就是一个简单的django使用示例

关于url路径最后边的斜杠说明,例如 index/

url(r'^home/', views.home)

前置导航斜杠不需要写,后面的斜杠是根据django的配置来的,如果在settings配置文件中我们设置了APPEND_SLASH = False,那么浏览器发送来的请求如果没有带着后面的斜杠,也是可以正常请求的,但是如果没有这个配置的话,django要求浏览器必须带着路径后面的斜杠来进行访问,如果你输入路径的时候没有加/,那么django让你的浏览器发一个重定向请求带上/

比如,访问的时候只写了index,django会让浏览器再次发送一个重定向请求index/

2.2url别名和命名空间

url别名的作用是当修改了url的访问路径,视图逻辑中返回的url路径也需要改动,其他相关联的地方也可能需要改动,这个时候我们在url中定义一个别名,如果后续更改了url的访问路径,其他地方只需要用到url别名的反向解析就能自动找到别名对应的url路径,这样的话只需要修改url路径而不更改其余地方

写法:
  url(r'^login/v2/', views.login,name='login'),

视图中反向解析:
    from django.urls import reverse

    def login(request):
        print(reverse('login'))  #/login/v2/
        if request.method == 'GET':
        return render(request,'login.html')
    else:
        uname = request.POST.get('uname')
        pwd = request.POST.get('pwd')
        if uname == 'admin' and pwd == 'admin':

            return HttpResponse('ok')
        else:
            return redirect(reverse('login'))  #使用反向解析



html模板渲染时反向解析的语法{% url 别名 %}
    <form action="{% url 'login' %}" method="post">
        {% csrf_token %}
        用户名:<input type="text" name="uname">
        密码:<input type="text" name="pwd">
        <input type="submit">
    </form>

2.3url别名反向解析参数

在urls文件中定义的url路径中如果有正则匹配,那么在视图函数中进行url别名反向解析的时候就需要带上参数了,而带参数又分为无名分组和有名分组

2.3.1url无名分组传参方式 args=(参数1,)

urls文件中定义url路径如下所示

url(r'book1/1/', views.book,name='book1'),
url(r'book2/(\d+)/', views.book,name='book2'),

现在想做的效果是访问book1/1/然后重定向到book2,视图文件内容如下

def book1(request):
    return redirect('book2')

def book2(request):
    return HttpResponse('book2')

这个时候访问127.0.0.1/book/1会报错,因为book2的url是有正则匹配的,这个时候没有传参数,所以会报错如下

iShot2020-10-16 14.20.43

此时就需要在url反向解析时传参了,urls文件中的正则匹配是无名分组,无名分组的传参方式是args=()

from django.urls import reverse

def book1(request):
    #url无名分组传参是args
    return redirect(reverse('book2',args=(1,)))

#urls中book2有无名分组,因此需要传一个参数,参数名任意
def book2(request,n):
    return HttpResponse('book2')

传参后再访问就可以正确重定向了

iShot2020-10-16 14.21.34

2.3.2url有名分组传参方式 kwargs={'分组名称':'参数'}

urls文件中定义url路径如下所示

url(r'book1/1/', views.book1,name='book1'),

#定义一个有名分组,名称为book2
url(r'book2/(?P<book2>\d+)/', views.book2,name='book2'),

现在想做的效果是访问book1/1/然后重定向到book2,视图文件内容如下

def book1(request):
    return redirect('book2')

def book2(request):
    return HttpResponse('book2')

这个时候访问127.0.0.1/book/1会报错,因为book2的url是有正则匹配的,这个时候没有传参数,所以会报错如下

iShot2020-10-16 14.22.00

此时就需要在url反向解析时传参了,urls文件中的正则匹配是有名分组,有名分组传参方式是kwargs={'分组名称':'参数'}

from django.urls import reverse

def book1(request):
    #这里是url有名分组位置传参,page就是urls文件中定义的url有名分组名称
    return redirect(reverse('book2',kwargs={'page':1}))

#在要重定向的路径函数中也需要传递urls文件中定义的url有名分组名称  
def book2(request,page):
    return HttpResponse('book2')

传参后再访问就可以正确重定向了

iShot2020-10-16 14.22.21

泡泡吐肥皂o © gitbook.pptfz.top 2021 all right reserved,powered by Gitbook文件修订时间: 秃笔南波湾!!!

results matching ""

    No results matching ""