• Django视图(一)


    目录

    一、视图的介绍

    二、使用视图

    1.定义视图

    2.配置URLconf

    3.测试请求

    三、url、path、re_path三者的区别

    1.url

    2.path

    3.re_path

    四、路由命名与reverse反解析

    1 路由命名

    2 reverse反解析


    一、视图的介绍

    • 视图就是应用views.py文件中的函数
    • 视图的第一个参数必须为HttpRequest对象,还可能包含下参数如
      • 通过正则表达式组获取的位置参数
      • 通过正则表达式组获得的关键字参数
    • 视图必须返回一个HttpResponse对象子对象作为响应
      • 子对象: JsonResponse HttpResponseRedirect
    • 视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者
      • 响应内容可以是HTML内容404错误重定向json数据...

    视图的处理过程:

    使用视图时需要进行两步操作,两步操作不分先后

    • 应用/views.py中定义视图
    • 配置URLconf

    二、使用视图

    1.定义视图

    • 视图就是一个Python函数,被定义在应用的views.py中.
    • 视图的第一个参数是HttpRequest类型的对象request,包含了所有请求信息.
    • 视图必须返回HttpResponse对象,包含返回给请求者的响应信息.
    • 需要导入HttpResponse模块 :

    from django.http import HttpResponse

    定义视图函数 : 响应字符串‘这是我的第一个视图’给客户端

    1. from django.shortcuts import render
    2. from django.http import HttpResponse
    3. # Create your views here.
    4. def index(request):
    5. return HttpResponse('这是我的第一个视图!')

    打开views.py输入上述代码

    2.配置URLconf

    查找视图的过程 :

            1.请求者在浏览器地址栏中输入URL, 请求到网站.

            2.网站获取URL信息.

            3.然后与编写好的URLconf逐条匹配.

            4.如果匹配成功则调用对应的视图.

            5.如果所有的URLconf都没有匹配成功.则返回404错误.

    URLconf入口

    ROOT_URLCONF = 'bookmanager.urls'——>是默认的的URLconf入口

    URLconf入口可以根据自己的需求修改,但一般都默认使用

    完成URLconf配置分为两步:

    1.在应用中定义URLconf

    首先,在应用目录中新建一个urls.py文件,在文件中导入相关的模块代码如下:

    1. from django.urls import path
    2. from book.views import index
    3. urlpatterns = [
    4. path('', index)
    5. ]

    2.在项目中定义URLconf

    打开项目中的urls.py,文件已有admin的url,所有我们可以直接访问到站点管理

    在【urlpatterns】列表中我们可以定义添加我们的URLconf,在注释中,有提供我们如何添加url的参考例子,添加后的代码如下:

    1. from django.contrib import admin
    2. from django.urls import path,include
    3. urlpatterns = [
    4. path('admin/', admin.site.urls),
    5. path('index/', include('book.urls'))
    6. ]

    当我们完成了配置URLconf的步骤后,我们就能通过运行代码来,访问我们的视图。

    3.测试请求

    运行代码:

    打开我们的网址

     在搜索框中输入127.0.0.0:8000/index/,就能看到我们设置的视图

    三、url、path、re_path三者的区别

            初学者一般不能分清两者的区别,所这简单介绍下两者.首先,url是Django 1.x中的写法,p在Django2.1中,开始舍弃django1.x中的url写法。

            在django2.x中,描写url配置的有两个函数path和re_path.re_path()函数可以看做是django 1.x中得url函数,即可以在路径中使用正则.

    1.url

    在settings.py文件中有一个ROOT_URLCONF设置,设置的是在访问网址时通过哪一个url文件去匹配所请求的网址

    url参数

    url或者re_path要复杂一些 (r'^blog/(?P[0-9]{4})/′)首先需要开始符和结尾符 ') 首先需要开始符^和结尾符 ′)首先需要开始符和结尾符,参数匹配一个 ()就是一个匹配参数,

    (?P<匹配的字段名>正则表达式)

    进行匹配是不包括get或者post请求方式的参数及域名比如www.qq.com/blog?num=1并不会匹配?后边的字符

    可以给request参数设置一个默认值,最常见的分页url,比如

    1. urlpatterns=[
    2. url(r'^page/$',views.page),
    3. url(r'^page(?P[0-9]+)$',views.page)
    4. ]
    5. #views
    6. def page(request,num='1'):
    7. pass

    自定义错误页面关键字handler400=blog.views.page_no_find

    1. #urls.py
    2. handler400=blog.views.page_no_find

    2.path

            参数的使用方法path(‘blog/str:string/') 简单了很多,就是尖括号,前边是str代表参数的类型,后面代表参数的名称

    path参数类型

    捕获url中的参数需要用到尖括号<> 指定尖括号中的值类型比如int:astr:link这个转换器还有许多类型比如:

    int 匹配0和正整数

    str 匹配任何空字符串但不包括/

    slug 可理解为注释 匹配任何ascii码包括连接线和下划线

    uuid 匹配一个uuid对象(该对象必须包括破折号—,所有字母必须小写)

    path 匹配所有的字符串 包括/(意思就是path前边和后边的所有)

    3.re_path

    如果遇上路径和转换器语法都不足以定义的URL模式,那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()。

    举例:传递 数字结尾的参数

    re_path(r'(\d+)/$',views.peopleList,name='peopleList'),

    四、路由命名与reverse反解析

    1 路由命名

    在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。

    1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如

    url(r'^',include('book.urls',namespace='book'))
    

    命名空间表示,凡是book.urls中定义的路由,均属于namespace指明的book名下。

    命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。

    2) 在定义普通路由时,可以使用name参数指明路由的名字,如

    1. urlpatterns = [
    2. url(r'^$',index),
    3. # 匹配书籍列表信息的URL,调用对应的bookList视图
    4. url(r'^booklist/$',bookList,name='index'),
    5. url(r'^testproject/$',views.testproject,name='test'),
    6. ]

    2 reverse反解析

    使用reverse函数,可以根据路由名称,返回具体的路径,如:

    1. from django.core.urlresolvers import reverse
    2. #或者
    3. from django.urls import reverse
    4. def testproject(request):
    5. return HttpResponse("OK")
    6. # 定义视图:提供书籍列表信息
    7. def bookList(request):
    8. url = reverse('book:test')
    9. print(url)
    10. return HttpResponse('index')
    • 对于未指明namespace的,reverse(路由name)
    • 对于指明namespace的,reverse(命名空间namespace:路由name)
  • 相关阅读:
    Java项目:SSM简单院校教师工资管理系统
    SWT/ANR问题--AMS/WMS
    跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波
    c++ 各版本特性介绍
    react中hook的useState
    JS进阶-变量和函数提升
    常用算法-Java
    土壤温湿度传感器
    每天一道算法题(五)——判断一组数字是否连续,出现连续数字的时候以‘-’输出
    正则表达式基础
  • 原文地址:https://blog.csdn.net/m0_61491995/article/details/126081399