IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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

def path_(request):
    path = request.path
    return HttpResponse(path)


def method_(request):
    method = request.method
    return HttpResponse(method)


def get_(request):
    res = request.GET
    print(res)
    return HttpResponse(res)

urls.py

from django.contrib import admin
from django.urls import path, re_path, include
from app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('path/', views.path_),
    path('method/', views.method_),
    path('get/', views.get_),
]

?效果:

?

?

?

?

?控制台打印出的结果:<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_视图

def get_(request):
    res = request.method
    if res == 'GET':
        return HttpResponse('发送的是get请求...')
    elif res == 'POST':
        data = request.POST
        return HttpResponse(data)
    else:
        return HttpResponse('发送的是其他类型请求...')

重新启动django服务

?

?发送get请求可以得到请求,发送post请求就会报错,这是因为我们没有关闭安全验证

将settings.py中的middleware中的 'django.middleware.csrf.CsrfViewMiddleware' 注释掉即可

?再次发送携带表单数据的post请求,就可以得到正常的响应

?我们利用request的GET,POST属性拿到的数据是QueryDict形式,他也是字典,我们可以像普通字典一样进行取值

res = data['type']

但是当键名不存在时,后端就会报错,此时我们可以利用字典的get方法进行取值(如果键对应了多个值,则默认取出最后一个)

res = data.get('type')

因为QueryDict允许一键多值,我们有时候需要拿到这些所有值,就可以调用getlist方法

res_list = data.getlist('type')

非表单数据的接收

非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。

- request.body.decode() :解码为字符串类型

- json.loads(字符串类型):将字符串转换为字典类型

- json.dumps(字典类型):将字典数据dict序列化为字符串形式

在postman中传递非表单数据:body -> raw -> text 下面选择非表单数据格式

json格式数据的接收:

views.py中定义这样一个视图

def json_(request):
    data_bytes = request.body
    data_str = data_bytes.decode()
    data_json = json.loads(data_str)
    return JsonResponse(data_json)

?需要注意的是:HttpResponse返回的文本格式的响应,而我们要返回的是json格式的数据,所以要用到JsonResponse

在urls.py中分配路由

path('json/', views.json_)

利用postman发送携带非表单数据的post请求

文件的接收

在postman中传递文件:①. body -> binary -> select 选择要上传的文件?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?②. form-data -> 在key中把text改成file -> select 选择要上传的文件?

在项目文件夹下创建一个叫files的文件夹,用来保存上传的文件

第①中方式的接收:

在views.py中定义这样一个视图

def file_2(request):
    data_ = request.body
    with open('./files/图片.png', 'wb') as f:
        f.write(data_)
    return HttpResponse('图片已保存成功...')

在urls.py中分配路由

path('file2/', views.file_2)

?效果:

可以看到在我们创建的files文件夹中成功保存了我们上传的图片

需要注意的是:可能会由于我们上传的文件过大而报错,此时需要修改参数,在settings.py文件中加入:DATA_UPLOAD_MAX_MEMORY_SIZE = 5242880 将上传大小修改为5M

第②中方式的接收:

views.py中定义这样一个视图

def file_(request):
    data_file = request.FILES.get('picture')
    with open('./files/图片.png', 'wb') as f:
        f.write(data_file.read())
    return HttpResponse('图片已保存成功...')

在urls.py中分配路由

path('file/', views.file_)

效果:

?

?可以看到在我们创建的files文件夹中成功保存了我们上传的图片

需要注意的是:data_file = request.FILES.get('picture')? get中的参数一定要与form表单中key的值相同

四、重定向

在views.py中定义两个视图

def entrance_(request):
    path = reverse('exit')
    return redirect(path)


def exit_(request):
    return HttpResponse('重定向到了exit,这是出口...')

在 项目urls.py 中为 子应用urls.py 和 exit_视图 分发路由

path('entrance/', include('app.urls')),
path('exit/', views.exit_, name='exit')

在 应用urls.py 中为 entrance_ 视图分发路由

path('middle/', views.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_视图进行修改:

def entrance_(request):
    return redirect('https://www.baidu.com/')

回车后即跳转到了百度首页?

重定向就是由一个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字符串

具体设置方式如下:

def file_(request):
    data_file = request.FILES.get('picture')
    with open('./files/图片.png', 'wb') as f:
        f.write(data_file.read())
    return HttpResponse(content='图片已保存成功...',status=403)

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:

def new_(request):
    response = HttpResponse()
    response.content = '这是重写后的内容...'
    response.status_code = 404
    response.reason_phrase = '404 is great!'
    return response

?urls.py:

path('new/', views.new_)

效果:

可以看到显示了我们设置的响应体,就算访问成功,状态码也是我们设置的404,状态码的原因也成功被我们修改成 404 is great!?

使用HttpResponse的方法:

1._init_方法

views.py:

def new_method(request):
    response = HttpResponse()
    response.__init__(content='这是我们用初始化方法设置的响应体...', status='250', reason='You are 250')
    return response

?urls.py:

path('new_method/', views.new_method)

效果:

可以看到显示了我们设置的响应体,状态码也是我们设置的250,状态码的原因也成功被我们修改

2.write方法

如果content的内容很多时,我们可以使用write方法:

?views.py:

def write_(request):
    response = HttpResponse()
    response.write('<title>我的歌单</title>')
    response.write('<p>给电影人的情书</p>')
    response.write('<p>永不失联的爱</p>')
    response.write('<p>如此</p>')
    response.write('<p>她说</p>')
    response.write('<p>Always Online</p>')
    return response

urls.py:

path('write/', views.write_)

效果:

?可以看到write方法可以通过写前端代码,来修改网页标题和网页内容

使用HttpResponse子类:

HttpResponse子类和HttpResponse差不多,使用方法相同,只不过每个子类的状态码已经对应设置好

首先导入要使用的子类,此处以 HttpResponseBadRequest 为例

from django.http import HttpResponseBadRequest

views.py:

def bad_(request):
    return HttpResponseBadRequest('页面无法显示...')

urls.py:

path('bad/', views.bad_)

?效果:

?当我们发送请求时,状态码是 BadRequest 的 400

FileResponse介绍:

FileResponse对象可以控制用户是否可以从前端下载某个图片

当FileResponse对象的as_attachment属性=True时,用户访问链接会直接下载图片

当FileResponse对象的as_attachment属性=False时,用户访问链接会将图片展示在前端

views.py:

def file_(response):
    data_ = open('./files/图片.png', 'rb')
    response = FileResponse(data_, as_attachment=True)
    return response

urls.py:

path('file/', views.file_)

效果:

当 as_attachment = True 时:

?图片成功下载,并且回到主页

当 as_attachment = False?时:

图片成功显示?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 11:58:44  更:2021-08-13 12:01:07 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计