Django基础讲解-路由控制器和视图(Django-02)

一 路由控制器

参考链接: Django源码阅读:路由(二) - 知乎

Route路由, 是一种映射关系!路由是把客户端请求的 url路径与视图进行绑定 映射的一种关系。

这个/timer通过路由控制器最终匹配到myapp.views中的视图函数 timer

在django中所有的路由最终都被保存到一个变量 urlpatterns, urlpatterns必须声明在主应用下的urls.py总路由中。这是由配置文件settings设置的。

在django运行中,当客户端发送了一个http请求到服务端,服务端的web服务器则会从http协议中提取url地址, 从程序内部找到项目中添加到urlpatterns里面的所有路由信息的url进行遍历匹配。如果相等或者匹配成功,则调用当前url对象的视图方法。

在给urlpatterns路由列表添加路由的过程中,django一共提供了2个函数给开发者注册路由,字符串路由和正则路由

from django.urls import path      # 字符串路由
from django.urls import re_path   # 正则路由,会把url地址看成一个正则模式与客户端的请求url地址进行正则匹配# path和re_path 使用参数一致.仅仅在url参数和接收参数时写法不一样

1.1 基本使用

path and re_path 两种路由的使用:

# 只要请求路径和正则匹配成功就会执行视图函数~
path(r'^articles/2003/$', views.special_case_2003),
re_path(r'^articles/([0-9]{4})/$', views.year_archive),# $ 符 不会被上面的覆盖掉 上面的就匹配不成功了
# 1、简单分组 ([0-9]{4})  ([0-9]{2})  是按位置传参的 和参数位置有关
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),#加个小括号是正则的简单分组 符合小括号的正则内容 会按形参入到视图函数中 函数也要接收~# 2、有名分组 ?P<year>  ?P<month> 是按关键字传参的 和参数位置无关 视图函数形参的参数名要保持一直
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive2),'''
re_path(r'^articles/(\d{4}/(\d{1,2})/$',articles_archive_by_month)
请求路径:/articles/2010/12
# 简单分组
re.findall("articles/(\d{4}/(\d{1,2})","/articles/2010/12") # 左边是规则 后面是请求路径 
一旦匹配成功:调用articles_archive_by_month(request,2010,12) # (\d{4}/(\d{1,2})分组了 就会传参 视图函数就会在数据库里进行查询# 有名分组
一旦匹配成功:
if 简单分组:调用articles_archive_by_month(request,2010,12)  # 位置传参
else if 有名分组:调用articles_archive_by_month(request,year = 2010,month = 12) # 关键字传参
'''

1.2 路由分发

from django.urls import path, re_path, includepath('api/', include('erp_system.urls')),
path('api/', include('basic_info.urls')),
path('api/', include('goods_info.urls')),
path('api/', include('purchase_info.urls')),
path('api/', include('warehouse_info.urls')),

1.3 反向解析

在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望 不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

反向解析:就是路由不想写死

在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:

在模板中:使用url模板标签

在Python 代码中:使用from django.urls import reverse 函数。(视图函数重定向中写url时)

urls.py中为url设置别名参数:

from django.conf.urls import url
from . import viewsurlpatterns = [#...name='news-year-archive'url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),#...
]

应用之在模板中反向解析: {% url 'news-year-archive' 2012 %} 别名:'news-year-archive' 正则参数:2012。

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
<a href="/articles/2012/">2012 Archive</a>
from django.shortcuts import redirect
from django.urls import reversedef redirect_to_year(request):year = 2006reverse_path=reverse('news-year-archive', args=(year,))return redirect(reverse_path)  # 等效 redirect("/articles/2006/")

二 视图

Django的视图主要有2种,分别是视图函数视图类 ,现在我们先从视图函数(FBV)进行入手,后面再学习视图类(CBV)

  • Function BaseView:函数基本视图

  • Class BaseView:类基本视图

2.1 请求方式

web项目运行在http协议下,默认肯定也支持用户通过不同的http请求发送数据来。django支持让客户端只能通过指定的Http请求来访问到项目的视图。

home/views.py

# 让用户发送POST才能访问的内容
from django.views.decorators.http import require_http_methods
@require_http_methods(["POST"])
def login(request):# 获取请求方式 GET/POSTprint(request.method)# 获取请求体数据print(request.body) # 一个字符串,代表请求报文的请求体的原数据print(request.POST) # 只有请求数据格式是 urlencoded 时才能获取到# 获取具体数据user = request.POST.get("user")# get()获取键对应值的列表里的最后一个元素hobby = request.POST.getlist("hobby")# 获取值列表里的所有元素return HttpResponse("登录成功!")

路由绑定,demo/urls.py,代码:

from django.contrib import admin
from django.urls import path
from home.views import timer
urlpatterns = [path('admin/', admin.site.urls),path("timer", timer),path("login", login),
]

2.2 请求对象

django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。 除了特殊说明的之外,其他均为只读的。

HttpRequest 对象包含当前请求URL的一些信息:

# 进入注册页面的视图函数
@require_http_methods(["GET"])
def register(request):print('进入register视图函数')user_id = request.GET['id']print(user_id, type(user_id))return HttpResponse(f'你传入的用户ID是:{user_id}')

2.2.1 请求方式

print(request.method)

2.2.2 请求数据

1. HttpRequest.GET:一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。

2. HttpRequest.POST:一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。# 注意:键值对的值是多个的时候, # 比如checkbox类型的input标签,select标签,需要用:request.POST.getlist("hobby")。
3. HttpRequest.body:一个字符串,代表请求报文的请求体的原数据。

2.2.3 请求路径

HttpRequest.path:  表示请求的路径组件(不含get参数)只是路径部分。
HttpRequest.get_full_path():含get参数的路径。

2.2.4 请求头

HttpRequest.META:一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,HttpRequest.META.get('HTTP_HOST')。

2.3 响应对象

响应对象主要有三种形式:

HttpResponse()     # 响应基础类
JsonResponse()     # json格式的响应 (接口编程,DRF)

render()     # 内核都是HttpResponse()

redirect()   # 内核都是HttpResponse()

2.3.1 HttpResponse()

Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个 HttpRequest 对象传给视图函数。那么视图函数在处理完相关的逻辑后,也需要返回一个响应给浏览器。

而这个响应,我们必须返回 HttpResponseBase 或者他的子类的对象。而 HttpResponse 则是 HttpResponseBase 用得最多的子类。

return HttpResponse("登录成功!",status=404,content_type='text/plain')

常用属性:

content:返回的内容。

status_code:返回的HTTP响应状态码。

content_type:返回的数据的MIME类型,默认为 text/html 。浏览器会根据这个属性,来显示数据。如果是 text/html ,那么就会解析这个字符串,如果 text/plain ,那么就会显示一个纯文本。

设置响应头: response['X-Access-Token'] = 'xxxx' 。

2.3.1.2 JsonResponse类:

用来对象 dump 成 json 字符串,然后返回将 json 字符串封装成 Response 对象返回给浏览器。并且他的 Content-Type 是 application/json 。示例代码如下:

from django.http import JsonResponsedef index(request):book = {"title":"三国演义","price":199}books = [{"title":"三国","price":99},{"title":"三国演义","price":199}]# JsonResponse(book)本质 是先序列化json.jump, ensure_ascii=False 使数据正常显示 。content_type='application/json' 声明一下响应类型# return HttpResponse(json.jump(book,ensure_ascii=False),content_type='application/json')# return JsonResponse(book) # 默认是序列化一个字典return JsonResponse(books,safe=False) # 序列化一个非字典数据(列表)

默认情况下 JsonResponse 只能对字典进行 dump ,如果想要对非字典的数据进行 dump ,那么需要给 JsonResponse 传递一个 safe=False 参数。

2.3.2 render() 渲染函数

render(request, template_name,[context])
#结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。\
render(request,'users/index.html',['ip':2013])

参数:

/*request: 用于生成响应的请求对象。iptemplate_name:要使用的模板的完整名称,可选的参数。模板文件非html文件因为里面有模板语句{{ip}},渲染后呈现在浏览器中的才是htm页面context:添加到模板上下文的一个字典,默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。*/

render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。

2.3.3 redirect方法 (重定向)

当您使用Django框架构建Python Web应用程序时,您在某些时候必须将用户从一个URL重定向到另一个URL,通过redirect方法实现重定向。

参数可以是:

  • 一个绝对的或相对的URL, 将原封不动的作为重定向的位置.

  • 一个url的别名: 可以使用reverse来反向解析url

# 传递要重定向到的一个具体的网址
def my_view(request):...return redirect("/some/url/")
# 当然也可以是一个完整的网址
def my_view(request):...return redirect("http://www.baidu.com")
# 传递一个视图的名称
def my_view(request):...return redirect(reverse("url的别名"))

重定向 会有两次请求 第一次返回一个响应头location:/index/ (/index/ 是 resirect里写的相对路径) code:301 只要浏览器读取到301或302 就会发起新的请求 第二次返回一个index.html页面。

APPEND_SLASH的实现就是基于redirect,默认补充浏览器请求路径的 / 在setting文件中配置 APPEND_SLASH=False 将默认补充关闭。

三 登录验证案例

3.1 html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>/*/users/auth 相对路径一定要加第一个/*/
<form action="/user/auth" method="post">用户名<input type="text" name="user">密码 <input type="password" name="pwd">/*span标签提示错误信息*/<input type="submit"> <span style="color: red">{{ msg }}</span>
</form>
</body>
</html>

3.2 路由配置

from django.contrib import admin
from django.urls import path, re_path,includefrom users.views import login,auth
urlpatterns = [path("login",login),path("auth",auth),
]

3.3 视图函数

def login(request):return render(request,"login.html")def auth(request):#  获取数据print("request.POST:",request.POST)user = request.POST.get("user")pwd = request.POST.get("pwd")# 模拟数据校验if user == "laomao" and pwd == "123456":# return HttpResponse("验证通过")return redirect("/users/")else:# return HttpResponse("用户名或者密码错误")# return redirect("/users/login")# 重定向适合动态页面 静态页面可以用render# 静态页面渲染一些信息一般用rendermsg = "用户名或者密码错误"return render(request,"login.html",{"msg":msg})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抄写Linux源码(Day14:从 MBR 到 C main 函数 (3:研究 head.s) )

回忆我们需要做的事情&#xff1a; 为了支持 shell 程序的执行&#xff0c;我们需要提供&#xff1a; 1.缺页中断(不理解为什么要这个东西&#xff0c;只是闪客说需要&#xff0c;后边再说) 2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的&#xff0c;所以需要这两个东…

山西电力市场日前价格预测【2023-10-08】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-08&#xff09;山西电力市场全天平均日前电价为258.40元/MWh。其中&#xff0c;最高日前电价为496.19元/MWh&#xff0c;预计出现在18:45。最低日前电价为0.00元/MWh&#xff0c;预计出…

【FreeRTOS】内存管理简单介绍

有没有想过什么移植FreeRTOS时&#xff0c;为什么有多种的内存文件&#xff0c;我们工程只使用Heap_4&#xff0c;其他的有什么用&#xff1f;每个的区别是什么&#xff1f;FreeRTOS是一种流行的实时操作系统&#xff0c;广泛应用于嵌入式系统开发中。在嵌入式系统中&#xff0…

(三)行为模式:8、状态模式(State Pattern)(C++示例)

目录 1、状态模式&#xff08;State Pattern&#xff09;含义 2、状态模式的UML图学习 3、状态模式的应用场景 4、状态模式的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5、C实现状态模式的实例 1、状态模式&#xff08;State Pattern&#x…

光伏发电预测(LSTM、CNN_LSTM和XGBoost回归模型,Python代码)

运行效果&#xff1a;光伏发电预测&#xff08;LSTM、CNN_LSTM和XGBoost回归模型&#xff0c;Python代码&#xff09;_哔哩哔哩_bilibili 运行环境库的版本 光伏太阳能电池通过互连形成光伏模块&#xff0c;以捕捉太阳光并将太阳能转化为电能。因此&#xff0c;当光伏模块暴露…

深入探究 C++ 编程中的资源泄漏问题

目录 1、GDI对象泄漏 1.1、何为GDI资源泄漏&#xff1f; 1.2、使用GDIView工具排查GDI对象泄漏 1.3、有时可能需要结合其他方法去排查 1.4、如何保证没有GDI对象泄漏&#xff1f; 2、进程句柄泄漏 2.1、何为进程句柄泄漏&#xff1f; 2.2、创建线程时的线程句柄泄漏 …

成功解决@Async注解不生效的问题,异步任务处理问题

首先&#xff0c;有这样一个异步监听方法 然后配置好了异步线程池 package com.fdw.study.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Conf…

国产1.8V低电压输入,可用于驱动步进电机;H 桥驱动电路单元可以直接驱动IR-CUT

D6212是专为安防摄像头系统设计的驱动电路&#xff0c;电路由八路达林顿管 阵列和 H 桥驱动电路两个单元组成。八路达林顿管阵列均带有续流二极 管&#xff0c;可用于驱动步进电机&#xff1b;H 桥驱动电路单元可以直接驱动IR-CUT。单个 达林顿管在输入电压低至 1.8V 状态下支持…

口袋参谋:如何提升宝贝流量?这三种方法超实用!

​你的店铺能不能出爆款&#xff1f;提升单品流量是关键。 对于新手卖家来说&#xff0c;是缺乏运营技巧和运营经验的&#xff0c;运营技巧主要体现在标题写作、各种图片和视频制作等。 由于新手买家没有经验&#xff0c;习惯于直接使用数据包上传&#xff0c;导致宝贝没有展…

Java卷上天,可以转行干什么?

小刚是某名企里的一位有5年经验的高级Java开发工程师&#xff0c;每天沉重的的工作让他疲惫不堪&#xff0c;让他萌生出想换工作的心理&#xff0c;但是转行其他工作他又不清楚该找什么样的工作 因为JAVA 这几年的更新实在是太太太……快了&#xff0c;JAVA 8 都还没用多久&am…

cpp primer plus笔记01-注意事项

cpp尽量以int main()写函数头而不是以main()或者int main(void)或者void main()写。 cpp尽量上图用第4行的注释而不是用第5行注释。 尽量不要引用命名空间比如:using namespace std; 函数体内引用的命名空间会随着函数生命周期结束而失效&#xff0c;放置在全局引用的命名空…

PX4仿真添加world模型文件,并使用yolov8进行跟踪

前言 目的:我们是为了在无人机仿真中使用一个汽车模型,然后让仿真的无人机能够识别到这个汽车模型。所以我们需要在无人机仿真的环境中添加汽车模型。 无人机仿真中我们默认使用的empty.world文件,所以只需要将我们需要的模型添加到一起写进这个empty.world文件中去就可以…

jmeter添加断言(详细图解)

先创建一个线程组&#xff0c;再创建一个http请求。 为了方便观察&#xff0c;我们添加两个监听器&#xff0c;察看结果树和断言结果。 添加断言&#xff1a;响应断言&#xff0c;响应断言也是比较常用的一个断言 设置响应断言&#xff1a;正常情况下响应代码是200。选择响应代…

Multisim:JFET混频器设计(含完整程序)

目录 前言实验内容一、先看作业题目要求二、作业正文IntroductionPre-lab work3.13.2 Experiment Work4.1(2)circuit setup4.1(3)add 12V DC4.1(4)set input x1 and x24.1(5)4.1(6)4.1(7)4.2(1)(2)4.2(3)4.2(4)4.3(1)(2)4.3(3) Conclusion 三、资源包内容 前言 花了好大心血完成…

NPDP产品经理知识(产品创新管理)

复习文化,团队与领导力 产品创新管理: 如何树立愿景: 如何实现产品战略=== 计划 实施产品开发: 商业化,营销计划,推广活动

1-Java SE基础

Java SE基础知识总结 背景知识 3种技术架构 Java SE&#xff1a;Java Platform Standard Edition&#xff08;标准版&#xff09;&#xff0c;完成桌面应用程序的开发&#xff0c;是其它两者的基础Java ME&#xff1a;Java Platform Micro Edition&#xff0c;开发电子消费产…

Vue中如何进行分布式任务调度与定时任务管理

在Vue中进行分布式任务调度与定时任务管理 分布式任务调度和定时任务管理是许多应用程序中的关键功能之一。它们用于执行周期性的、异步的、重复的任务&#xff0c;例如数据备份、邮件发送、定时报告生成等。在Vue.js应用中&#xff0c;我们可以结合后端服务实现分布式任务调度…

关于氮化镓的干蚀刻综述

引言 GaN及相关合金可用于制造蓝色/绿色/紫外线发射器以及高温、高功率电子器件。由于 III 族氮化物的湿法化学蚀刻结果有限&#xff0c;因此人们投入了大量精力来开发干法蚀刻工艺。干法蚀刻开发一开始集中于台面结构&#xff0c;其中需要高蚀刻速率、各向异性轮廓、光滑侧壁…

记一次 .NET某账本软件 非托管泄露分析

一&#xff1a;背景 1. 讲故事 中秋国庆长假结束&#xff0c;哈哈&#xff0c;在老家拍了很多的短视频&#xff0c;有兴趣的可以上B站观看&#xff1a;https://space.bilibili.com/409524162 &#xff0c;今天继续给大家分享各种奇奇怪怪的.NET生产事故&#xff0c;希望能帮助…

Java基础(二)

1. 面向对象基础 1.1 面向对象和面向过程的区别 面向过程把解决问题的过程拆成一个个方法&#xff0c;通过一个个方法的执行解决问题。面向对象会先抽象出对象&#xff0c;然后用对象执行方法的方式解决问题。 面向对象开发的方式更容易维护和迭代升级、易复用、易扩展。 1…