| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Django(第二周) -> 正文阅读 |
|
[Python知识库]Django(第二周) |
一、HttpRequest对象服务器接收http请求后,会根据报文创建HttpRequest对象作为视图的第一个参数。由Django创建,在调用视图的时候传递给视图。 注意:视图的第一个参数必须是HttpRequest对象。 请求的处理流程:其实整个流程就像追女生: 用户(男生)先确认目标url(找到心仪的女生),再发起一个Http请求(表白),Django(女生)会按照以下逻辑对请求进行处理。 1.确定URLconf的根配置位置,通常是在ROOT_URLCONF中设置。如果请求的请求对象包含了urlconf属性,则按照该属性查找URLconf(检查男生是否符合自己的择偶标准:人品,颜值,收入等)。 2.加载配置信息,在配置信息中查找urlpatterns(检查是否在urlpatterns中是否有多个追求者)。 3.按顺序查找urlpatterns中的所有URL模式字符串,并定位在第一个与URL匹配的URL模式字符串(如果有多个追求者,只接受最心仪的男生)。 4.当检索到匹配的URL模式串后,调用对应的视图,并传递以下参数(确认了心仪男生后,思考如何答复对方): ????????(1).一个HttpRequest对象实例。 ????????(2).如果匹配的URL模式字符串包含未命名的组,那么匹配的信息会作为位置参数传递给视图。 ????????(3).路径表达式中的命名部分组成了视图的关键字参数,以上关键字参数会被django.url.path()或django.url.re_path()kwargs覆盖。 5.如果在URLconf中没有找到任何匹配的模式字符串,或者出现其他任何错误,Django将会调用一个用于处理错误信息的视图(如果都不是心仪的男生,出于礼貌拒绝对方)。 HttpRequest对象的常用属性path:请求的完整路径(不包括域名和端口) method:表示请求的方式,常用的有GET,POST encoding:表示浏览器提交的数据的编码方式,一般为utf-8 GET:类似于字典的对象,包含了get请求的所有参数 POST:类似于字典的对象,包含了post请求的所有参数 FILES:类似字典的对象,包含了所有上传的文件 COOKIES:字典,包含所有的cookie session:类似字典的对象,表示当前会话方法 is_ajax():如果是通过XMLHttpRequest发起的,返回 True ?使用方法:在views.py函数中定义视图,使用HttpRequest属性,在urls.py中分发路由 views.py
urls.py
?效果: ? ? ? ? ?控制台打印出的结果:<QueryDict: {'type': ['喜剧'], 'area': ['大陆']}> ?需要注意的是:GET属性是返回请求的所有参数,当我们没有输入参数时,返回为空;当我们输入参数时,返回参数名不返回值,控制台打印的结果是一个类似字典的对象,其实它就是django.http.QueryDict对象的实例,与普通字典的区别:QueryDict允许一个键多个值 二、查询字符串查询字符串又称为URL参数,指在URL末尾加上用于向服务器发送信息的字符串(变量)。用“?”连接,后面紧接“参数=值”,如果想添加多个参数的话,使用“&”连接多个参数。以这样的形式,将想要发送给服务器的数据添加到URL中。 例如:https://www.baidu.com/s?wd=中国&fenlei=256&rsv_pq=b4a9dea400071d17 ? 注意:“?”只能使用一次 被动参数: 网站访问分析: ? 被动参数对显示的内容没有影响。无论是否添加参数,显示的页面都是相同的。 用途: ? 为了进行Web网站的访问分析。了解用户是从什么地方到达了自己的网站,设定固有的参数去统计。 活动参数: 显示动态页面结果: ? 不同于被动参数,活动参数会影响显示的内容,也就是在添加参数之后,网站上显示的内容也会发生改变。 三、数据接收首先需要安装一个接口测试软件postman:https://www.postman.com/downloads/,安装在自己的路径下 使用: 打开应用 -> file -> new -> request -> request name:django_test(可以随便取)-> 路径自己创建 就可以通过postman发送请求,测试端口,查看响应 表单数据的接收我们改写get_视图
重新启动django服务 ? ?发送get请求可以得到请求,发送post请求就会报错,这是因为我们没有关闭安全验证 将settings.py中的middleware中的 'django.middleware.csrf.CsrfViewMiddleware' 注释掉即可 ?再次发送携带表单数据的post请求,就可以得到正常的响应 ?我们利用request的GET,POST属性拿到的数据是QueryDict形式,他也是字典,我们可以像普通字典一样进行取值
但是当键名不存在时,后端就会报错,此时我们可以利用字典的get方法进行取值(如果键对应了多个值,则默认取出最后一个)
因为QueryDict允许一键多值,我们有时候需要拿到这些所有值,就可以调用getlist方法
非表单数据的接收非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。 - request.body.decode() :解码为字符串类型 - json.loads(字符串类型):将字符串转换为字典类型 - json.dumps(字典类型):将字典数据dict序列化为字符串形式 在postman中传递非表单数据:body -> raw -> text 下面选择非表单数据格式 json格式数据的接收:views.py中定义这样一个视图
?需要注意的是:HttpResponse返回的文本格式的响应,而我们要返回的是json格式的数据,所以要用到JsonResponse 在urls.py中分配路由
利用postman发送携带非表单数据的post请求 文件的接收在postman中传递文件:①. body -> binary -> select 选择要上传的文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?②. form-data -> 在key中把text改成file -> select 选择要上传的文件? 在项目文件夹下创建一个叫files的文件夹,用来保存上传的文件 第①中方式的接收: 在views.py中定义这样一个视图
在urls.py中分配路由
?效果: 可以看到在我们创建的files文件夹中成功保存了我们上传的图片 需要注意的是:可能会由于我们上传的文件过大而报错,此时需要修改参数,在settings.py文件中加入:DATA_UPLOAD_MAX_MEMORY_SIZE = 5242880 将上传大小修改为5M 第②中方式的接收: views.py中定义这样一个视图
在urls.py中分配路由
效果: ? ?可以看到在我们创建的files文件夹中成功保存了我们上传的图片 需要注意的是:data_file = request.FILES.get('picture')? get中的参数一定要与form表单中key的值相同 四、重定向在views.py中定义两个视图
在 项目urls.py 中为 子应用urls.py 和 exit_视图 分发路由
在 应用urls.py 中为 entrance_ 视图分发路由
我们在postman中输入路径:http://127.0.0.1:8000/entrance/middle/? 在路径中我们只调用了entrance_视图,却出现了exit_视图的运行结果,这是因为我们在输入entrancce/时进入子应用urls,输入middle/,执行entrance_视图,在entrance_视图中我们逆向解析了名字是exit的视图,以此获得了exit_视图的路径,最后由entrance_视图中的语句:return redirect(path) 根据路径找到exit_视图并执行。这整个过程就是重定向。 网站其实就是一种路径,也可以用作重定向:比如?https://www.baidu.com/ 我们对entrance_视图进行修改:
回车后即跳转到了百度首页? 重定向就是由一个URL跳转到另一个URL - 1.重定向网址:return? redirect("网址") - 2.重定向路由:return? redirect("/路由名/") - 3.重定向路由反解析:path = reverse(“命名空间namespace:路由name”)???? return redirect(path) 五、响应?前面我们一直在用HttpResponse对象,但没有对他进行介绍 HttpResponse对象是对用户的响应,与HttpRequest对象不同的是,HttpResponse对象需要开发人员在视图中创建。它属于django.http(from django.http import HttpResponse),可以通过构造函数传递网页内容的方式来构造HttpResponse实例,在实例化的同时可以指定浏览器对文本的处理方式 HttpResponse的常用属性:content: HTTP响应的内容 Charset: HTTP响应所使用的编码格式。如果在构建HttpResponse对象的时候没有给出charset,则会从content_type中提取字符编码格式,提取失败时使用配置文件中的DEFAULT_CHARSET。 Status_code: 响应的状态码 Reason_phrase: 每一个HTTP状态码都对应一个Reason-Phrases字符串 具体设置方式如下:
HttpResponse的常用方法:__init__(content=b’’, content_type=None, status=200, reason=None,?? charset=None) __setitem__(header, value)?? 设置HTTP头,header和value都是字符串 __delitem__(header)? 删除指定HTTP头,如果删除失败不会抛出异常,不区分字母大小写。 __getitem__(header)???? 返回指定HTTP头的值,不区分大小写。 Has_header(header)? 判断HTTP头是否存在,不区分大小写。 Setdefault(header, value)? 如果指定的HTTP头还没有设置则进行设置。 HttpResponse子类:为了处理不同类型的HTTP响应,Django还提供了一些HttpResponse子类(继承于HttpResponse类),分别如下。 HttpResponseRedirect:将请求跳转到其他地址。对应的HTTP状态码是302. HttpResponsePermanentRedirect:与HttpResponseRedirect相似,需要进行页面跳转,但状态码是301 HttpResponseNotModified:表示从用户最后一次访问到现在页面都没有发生改变,状态码为304 HttpResponseBadRequest:400 HttpResponseNotFound:404 HttpResponseForbidden:403 HttpResponseNotAllowed:405 构造函数的第一个参数是必须的,参数值是一组任意允许的HTTP method,如[‘GET’,’POST’] HttpResponseGone:410 HttpResponseServerError:500 了解了HttpResponse的常用属性、常用方法和子类,我们就可以不像以前一样,返回?return HttpResponse(..) 我们可以对HttpResponse的属性进行重写: views.py:
?urls.py:
效果: 可以看到显示了我们设置的响应体,就算访问成功,状态码也是我们设置的404,状态码的原因也成功被我们修改成 404 is great!? 使用HttpResponse的方法: 1._init_方法 views.py:
?urls.py:
效果: 可以看到显示了我们设置的响应体,状态码也是我们设置的250,状态码的原因也成功被我们修改 2.write方法如果content的内容很多时,我们可以使用write方法: ?views.py:
urls.py:
效果: ?可以看到write方法可以通过写前端代码,来修改网页标题和网页内容 使用HttpResponse子类: HttpResponse子类和HttpResponse差不多,使用方法相同,只不过每个子类的状态码已经对应设置好 首先导入要使用的子类,此处以 HttpResponseBadRequest 为例
views.py:
urls.py:
?效果: ?当我们发送请求时,状态码是 BadRequest 的 400 FileResponse介绍:FileResponse对象可以控制用户是否可以从前端下载某个图片 当FileResponse对象的as_attachment属性=True时,用户访问链接会直接下载图片 当FileResponse对象的as_attachment属性=False时,用户访问链接会将图片展示在前端 views.py:
urls.py:
效果: 当 as_attachment = True 时: ?图片成功下载,并且回到主页 当 as_attachment = False?时: 图片成功显示? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/26 1:50:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |