Django框架 - 视图详解
Django使用视图这个概念来负责处理用户请求和返回响应的逻辑部分
视图(即视图函数):就是一个python函数,专门处理web程序中的业务逻辑部分
视图可以接收用户的请求,并返回响应给用户的内容,可响应的的内容包括字符串、html页面、图片等各种格式
通常情况下,把所有的视图代码都放置在 views.py 文件中,也可以自定义存放
在视图函数中最重要的是用户请求和响应
请求对象 request
HTTP请求是指从客户端到服务器端的请求消息,包括消息首行中,对资源的请求方法、资源的标识符及使用的协议
request 是Django框架根据用户的请求报文封装的一个对象
request 对象中包含了所有请求相关的内容
- request.path 包含了请求的url路径
- request.method 包含请求的HTTP方法 GET,POST
- request.META.get('REMOTE_ADDR') 获取客户端IP
- request.GET 类字典对象,包含GET请求的数据
- request.POST 类字典对象,包含POST请求的数据
- request.FILES 类字典对象,包含上传的文件对象
- request.COOKIES 类字典对象,cookied对象
1.GET和POST请求
GET和POST都是HTTP常用的请求方式,除了这两个常用的方式以外还有很多其他请求方式
GET请求就是在浏览器地址栏或a链接发起的请求,通常情况下,请求中携带的参数会在地址栏位置显示,如:
HTTP:GET: http://127.0.0.1:8000/a/b/c?id=1&k=w
上面这个url如果使用的是GET请求,那么在地址栏就会显示请求的参数 id=1&k=w
POST请求一般都是由表单发起的,POST请求时所携带的数据是不可见的
区别:
- GET把参数包含在URL中,POST通过报文体传递参数
- GET请求在URL中传送的参数是有长度限制的,而POST没有
- GET发送的数据是 URL 的一部分,安全性较差,POST参数不会被保存在浏览器历史或web服务器日志中,更安全
2.获取GET和POST请求的数据
获取GET请求方式携带的参数:获取POST请求方式携带的参数:
- request.GET.dict() 获取GET中所有键值对,形成dict
- request.GET.get( 'key' , None) 获取指定key的值,可以设置默认值
- request.GET[ 'key' ] 把GET对象当做dict使用,如果key不存在则引发异常
1.准备HTML模板页面 templates/GET和POST请求.html
- request.POST.dict() 获取POST中所有键值对,形成dict
- request.POST.get( 'key' , None) 获取指定key的值,可以设置默认值
- request.POST[ 'key' ] 把POST对象当做dict使用,如果key不存在则引发异常
<body>
<ul>
<li>
<!-- ?id=1&k=w 是http请求时携带的参数 -->
<a href="/http/demo/?id=1&k=w">GET请求方式</a>
</li>
<li>
<!-- form是表单;action属性是提交地址;method属性是提交方式,默认为GET -->
<form action="/http/demo/" method="POST">
<!-- Django框架中对CSRF攻击做了安全防范,需要在所有POST请求中添加csrf_token口令进行验证 -->
{% csrf_token %}
<input type="text" name="kw">
<button>POST请求方式</button>
</form>
</li>
</ul>
</body>
2.准备接收请求的视图函数 web/home/views.py
# 显示html模板页面的视图函数
def index(request):
return render(request,'GET和POST请求.html')
# 接收HTTP请求的视图函数
def HttpDemo(request):
# 获取当前的请求方式
method = request.method
if method == 'GET' :
# 接收GET发送的数据
data = request.GET.dict()
elif method == 'POST' :
# 接收POST发送的数据
data = request.POST.dict()
return HttpResponse(f'GET和POST请求,当前请求方式:{method},接收的数据:{data}')
3.准备路由 web/home/urls.py
path('', views.index),
path('http/demo/', views.HttpDemo, name='HttpDemo')
响应对象 HttpResponse
在Django.http模块中定义了HttpResponse响应对象的API
HttpResponse响应对象由Django框架自动创建,并由开发者设置具体的响应内容
在每一个经过路由解析的视图中必须返回一个HttpResponse响应对象,或者HttpResponse的子对象
1.直接使用HttpResponse对象返回内容
# web/home/views.py
def index(request):
return HttpResponse('<p style="color:red;">响应任意字符串内容</p>')
2.返回模板文件
# render()有三个参数,第一个是请求对象,第二个是响应模板文件,第三个是传递给模板的dict数据
def index(request):
fcb = {'name':'哈白布','age':30,'pos':'mid'}
return render(request,'GET和POST请求.html', {'FCB':fcb})
# 对应的 GET和POST请求.html 中就可以使用模板引擎的语法来解析传递的数据
# <p>{{ FCB }}</p>
3.返回json数据 JsonResponse
def index(request):
fcb = {'name':'哈白布','age':30,'pos':'mid'}
# 可以在视图中直接返回json数据
return JsonResponse(fcb) # Content-Type: application/json
# 也可以手动把数据转为json,再使用HttpResponse进行响应
return HttpResponse(json.dumps(fcb)) # Content-Type: text/html; charset=utf-8
4.重定向 redirect
服务器端的跳转
def index(request):
return redirect('/http/demo/')
# return HttpResponseRedirect('/http/demo/')