Django内置函数详解Httprequest详解(模拟搜索/模拟用户登陆/模拟上传文件/下载文件)
函数名称 | ||
---|---|---|
http | HttoResponse | HttoResponse对象 |
http | StreamingHttpResponse | 响应可迭代对象 |
http | FileResponse | 下载文件 |
http | jsonResponse | 返回json |
shortcuts | render | 响应HttoResponse对象,一个快捷函数 |
views | generic view | 类视图继承的类 |
views | decorators csrf | 取消某视图csrf防护 |
contrib | admin | 内建管理后台 |
contrib | auth | login 登陆 |
contrib | auth | logout 退出 |
contrib | auth | authenticate 用户信息认证 |
contrib | auth | decorators login_required 登陆认证装饰器 |
contrib | auth | models user 获取登陆用户信息 |
contrib | auth | models Baseusermanager,abstractbaseuser 获取登陆用户信息 |
conf | settings | 导入配置文件 |
db | connection | 连接数据库 |
HttoResponse含义
·djiango会建立一个包含请求源数据的Httprequest对象,当djiango加载对应视图Httprequest对象将作为函数的第一个参数request,每个视图返回一个HttoResponse对象·
方法 | 描述 |
---|---|
request.get_host() | 服务器主机地址和端口 |
request.get_port() | 服务器端口 |
request.get_full_path() | 请求页面完整路径和查询参数 |
request.get_raw_uri | 请求页面url所有信息,包含主机名,路径参数 |
测试 | |
打印第一个参数和第二个参数
print(request.GET["a"])
print(request.GET["b"])
实现如图所示的功能
2.1 配置路由
re_path('^login/',views.login,name='login')
2.2 配置视图
def login(request):
if request.method == 'GET':
return render(request,'login.html')
2.3 配置登陆页面login.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆title>
head>
<body>
<h1>欢迎访问devops系统h1>
<form action="">
用户名 :<input type="text" name="username"><br>
密码 : <input type="text" name="password"><br>
<button type="submit">登陆button>
form>
body>
html>
请求测试
http://127.0.0.1:8000/login/
2.4 实现密码登陆的逻辑
GET 明文,不适合传输敏感数据,例如文章id,数据表格id,搜索功能
POST 在http请求正文里,例如用户密码,上传文件
2.4.1 导入跳转模块redirect,修改视图,模拟密码登陆的请求场景并返回相应的结果
def login(request):
if request.method == 'GET':
return render(request,'login.html')
elif request.method == 'POST':
print(request.POST)
username = request.POST.get('username')
password = request.POST.get('password')
#查询数据库用户名和密码是否正确,当正确时跳转首页
if username == 'zhangfan' and password == '123456':
#跳转首页
return redirect('/')
else:
msg = '用户名或者密码错误!'
#当密码错误时返回错误信息到前端首页
return render(request, 'login.html',{'msg':msg})
2.4.2 修改前端html页面
<span style="color: red;">{{ msg }}span>
最终实现密码正确能跳转到首页 ,密码错误前端返回错误信息
3.1 创建一个上传的路由
re_path('^user_upload/$', views.user_upload,name='user_upload')
3.2 编写视图 写一个上传user_upload的函数
def user_upload(request):
if request.method == "GET":
return render(request, 'upload.html')
elif request.method == "POST":
print(request.FILES)
obj = request.FILES.get('touxiang') #获取上传过来的头像
print(type(obj),obj.name)
import os
file_path = os.path.join('upload',obj.name) #定义上传文件的路径
with open(file_path,'wb') as f:
for i in obj.chunks(): #循环接收二进制文件块
f.write(i) #写入到本地
msg = "上传成功!"
return render(request, 'upload.html',{'msg':msg})
同级创建一个upload的文件目录
3.3 编写upload.html模版
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件title>
head>
<body>
<form action="{% url 'user_upload' %}" method="post", enctype="multipart/form-data">
<input type="file", name="touxiang">
<button type="submit">提交button>
<br>
<span style="color: red;">{{ msg }}span>
form>
body>
html>
3.4 上传一个图片测试测试
在本地upload目录下会显示刚才上传的图片,说明上传功能实现
编写 urls.py路由文件
re_path('^download/$',views.download,name='download'),
re_path('^down_file/(.*)$',views.down_file, name='down_file')
4.1 获取下载文件列表
def download(request):
print(os.getcwd())
file_list = os.listdir('upload')
print(file_list)
return render(request,"download.html",{'file_list': file_list})
4.2 编写下载文件函数
def down_file(request,filename):
file_path = os.path.join('upload',filename) #down_file/mm.jpg
response = StreamingHttpResponse(open(file_path, 'rb')) #打开二进制文件
response['Content-Type'] = 'application/octe-stream'
response['Content-Disposition'] = 'attachment; filename=%s' % (os.path.basename(file_path)) #指定下载的文件名
return response
4.3 编写下载文件模版
download.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下载文件列表title>
head>
<body>
{% for i in file_list %}
<a href="{% url 'down_file' i %}">{{ i }}a>
<br>
{# url结果: 拼接 :/down_file/m.jpg #}
{% endfor %}
body>
html>
4.4 验证 下载结果
http://127.0.0.1:8000/download/
点击任意列表实现文件图片的下载
request.GET应用场景:
1.获取客户端信息,请求页面的情况
2.接收客户端上传的数据和文件
3.根据客户端特定信息作相应处理,例如根据请求方法