重点
1、HttpRequest
1. 位置参数和关键字参数
2. 查询字符串
3. 请求体:表单数据,JSON数据
4. 请求头
2、HttpResponse
1.HttpResponse
2.JsonResponse
3.redirect
3、类视图
1.类视图的定义和使用
2.类视图装饰器(难点)
一、试图介绍和项目准备
3.视图必须返回一个HttpResponse对象或子对象作为响应
① 子对象: JsonResponse HttpResponseRedirect
4.视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者
① 响应内容可以是HTML内容,404错误,重定向,json数据...
二、URLconf
1. 浏览者通过在浏览器的地址栏中输入网址请求网站
2. 对于Django开发的网站,由哪一个视图进行处理请求,是由url匹配找到的
1. 项目中urls.py
匹配成功后,包含到应用的urls.py
url(正则, include('应用.urls'))
url(r'^',include('book.urls'))
2. 应用中urls.py
匹配成功后,调用views.py对应的函数
url(正则, views.函数名)
from django.conf.urls import url
from book.views import bookList(
urlpatterns = [
# 匹配书籍列表信息的URL,调用对应的bookList视图
url(r'^booklist/$',bookList)
]
注意:
正则部分推荐使用 r,表示字符串不转义,这样在正则
表达式中使用 \ 只写一个就可以
不能在开始加反斜杠,推荐在结束加反斜杠
正确:path/
正确:path
错误:/path
错误:/path/
请求的url被看做是一个普通的python字符串,进行匹配时不包括域名、get或post参数
3.1 如请求地址如下:
http://127.0.0.1:8000/18/?a=10
3.2 去掉域名和参数部分后,只剩下如下部分与正则匹配
18/
说明:
虽然路由结尾带/能带来上述好处,但是却违背了HTTP中URL表示资源位置路径的设计理念。
是否结尾带/以所属公司定义风格为准。
三、路由命名与reverse反解析(逆向)
命名空间表示,凡是book.urls中定义的路由,均属于namespace指明的book名下。
命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。
urlpatterns = [
url(r'^$',index),
# 匹配书籍列表信息的URL,调用对应的bookList视图
url(r'^booklist/$',bookList,name='index'),
url(r'^testproject/$',views.testproject,name='test'),
]
使用reverse函数,可以根据路由名称,返回具体的路径,如:
urlpatterns = [
url(r'^$',index),
# 匹配书籍列表信息的URL,调用对应的bookList视图
url(r'^booklist/$',bookList,name='index'),
url(r'^testproject/$',views.testproject,name='test'),
]
2 reverse反解析
使用reverse函数,可以根据路由名称,返回具体的路径,如:
from django.core.urlresolvers import reverse
#或者
from django.urls import reverse
def testproject(request):
return HttpResponse("OK")
# 定义视图:提供书籍列表信息
def bookList(request):
url = reverse('book:test')
print(url)
return HttpResponse('index')
1. 对于未指明namespace的,reverse(路由name)
2. 对于指明namespace的,reverse(命名空间namespace:路由name)
四、HttpRequest对象
1. 提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取;
2. 查询字符串(query string),形如key1=value1&key2=value2;
3. 请求体(body)中发送的数据,比如表单数据、json、xml;
4. 在http报文的头(header)中。
1 URL路径参数
如果想从URL中获取值,需要在正则表达式中使用分组,
获取值分为两种方式
1.位置参数
1. 参数的位置不能错
2.关键字参数
2. 参数的位置可以变,跟关键字保持一致即可
3.注意:两种参数的方式不要混合使用,在一个正则表达式中只能使用一种参数方式
4.分别使用以上两种获取URL值的方式提取出18 188
http://127.0.0.1:8000/18/188/
位置参数
1. 应用中urls.py
url(r'^(\d+)/(\d+)/$', views.index),
2. 视图中函数: 参数的位置不能错
def index(request, value1, value2):
# 构造上下文
context = {'v1':value1, 'v2':value2}
return render(request, 'Book/index.html', context)
关键字参数
1. 应用中urls.py
① 其中?P部分表示为这个参数定义的名称为value1
② 可以是其它名称,起名要做到见名知意
利用正则进行分组,起别名
url(r'^(?P\d+)/(?P\d+)/$', views.index),
2. 视图中函数: 参数的位置可以变,跟关键字保持一致即可
def index(request, value2, value1):
# 构造上下文
context = {'v1':value1, 'v2':value2}
return render(request, 'Book/index.html', context)
2 Django中的QueryDict对象
https://www.baidu.com/s?ie=utf-8&wd=itcast&rsv_pq=fdf543ed000f8688&rsv_t=8862Eb1lxc9858Ihke7VdJylicTyYs%2F3EuFyVPKcOBnv9wmTxLdhwlYL6%2F8&rqlang=cn&rsv_enter=1&rsv_sug3=5&rsv_sug1=4&rsv_sug7=100
以? 作为一个分隔
?前边 表示 路由
?后边 表示 get方式传递的参数 称之为 查询字符串
?key=value&key=value...
我们在登陆的时候会输入用户名和密码 理论上 用户名和密码都应该以POST方式进行传递
只是为了让大家好理解,我们接下来 用 get方式来传递用户名和密码
HttpRequest对象的属性GET、POST都是QueryDict类型的对象
与python字典不同,QueryDict (字典)类型的对象用来处理同一个键带有多个值的情况
方法get():根据键获取值
如果一个键同时拥有多个值将获取最后一个值
如果键不存在则返回None值,可以设置默认值进行后续处理
get(‘键’,默认值)
方法getlist():根据键获取值,可以返回多值,值以列表返回,可以获取指定键的所有值
如果键不存在则返回空列表[],可以设置默认值进行后续处理
getlist(‘键’,默认值)
查询字符串Query String
获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,
返回QueryDict对象。
# /get/?a=1&b=2&a=3
def get(request):
a = request.GET.get('a')
b = request.GET.get('b')
alist = request.GET.getlist('a')
print(a) # 3
print(b) # 2
print(alist) # ['1', '3']
return HttpResponse('OK')
重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,
依然可以通过request.GET获取请求中的查询字符串数据。
4 请求体
请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,
可以是XML字符串,应区别对待。
可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE。
Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,
在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件,
4.1 表单类型 Form Data
前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。
def post(request):
a = request.POST.get(‘a’)
b = request.POST.get(‘b’)
alist = request.POST.getlist(‘a’)
print(a)
print(b)
print(alist)
return HttpResponse(‘OK’)
4.2 非表单类型 Non-Form Data
非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,
自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。
例如要获取请求体中的如下JSON数据
{“a”: 1, “b”: 2}
可以进行如下方法操作:
import json
def post_json(request):
json_str = request.body
json_str = json_str.decode()
req_data = json.loads(json_str)
print(req_data['a'])
print(req_data['b'])
return HttpResponse('OK')
# json.damps 将字典转换成json形式的字符串
# json.loads 将json形式的字符串转换为字典
5 请求头
可以通过 request.META 属性获取请求头headers中的数据,request.META为字典类型。
常见的请求头如:
CONTENT_LENGTH– The length of the request body (as a string).
CONTENT_TYPE– The MIME type of the request body.
HTTP_ACCEPT– Acceptable content types for the response.
HTTP_ACCEPT_ENCODING– Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE– Acceptable languages for the response.
HTTP_HOST– The HTTP Host header sent by the client.
HTTP_REFERER– The referring page, if any.
HTTP_USER_AGENT– The client’s user-agent string.
QUERY_STRING– The query string, as a single (unparsed) string.
REMOTE_ADDR– The IP address of the client.
REMOTE_HOST– The hostname of the client.
REMOTE_USER– The user authenticated by the Web server, if any.
REQUEST_METHOD– A string such as"GET"or"POST".
SERVER_NAME– The hostname of the server.
SERVER_PORT– The port of the server (as a string).
具体使用如:
def get_headers(request):
print(request.META['CONTENT_TYPE'])
return HttpResponse('OK')
6 其他常用HttpRequest对象属性
method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
user:请求的用户对象。
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
encoding:一个字符串,表示提交的数据的编码方式。
如果为None则表示使用浏览器的默认设置,一般为utf-8。
这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
FILES:一个类似于字典的对象,包含所有的上传文件。
HttpResponse对象
视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,
HttpResponse对象由开发人员创建。
1 HttpResponse
可以使用django.http.HttpResponse来构造响应对象。
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
也可通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码:
1. content:表示返回的内容。传递字符串 不要传递 对象,字典等数据
2. status:HTTP status code must be an integer from 100 to 599. 只能使用系统规定的
3. status_code:返回的HTTP响应状态码。
4. content_type:是一个MIME 类型
语法形式是:大类/小类
5.text/html, text/css text/javascript
image/png image/gif image/jpeg
响应头可以直接将HttpResponse对象当做字典进行响应头键值对的设置:
1. response = HttpResponse()
2. response['itcast'] = 'Python' # 自定义响应头Itcast, 值为Python
示例:
from django.http import HttpResponse
def response(request):
return HttpResponse('itcast python', status=400)
或者
response = HttpResponse('itcast python')
response.status_code = 400
response['itcast'] = 'Python'
return response
2 HttpResponse子类
Django提供了一系列HttpResponse的子类,可以快速设置状态码
HttpResponseRedirect 301
HttpResponsePermanentRedirect 302
HttpResponseNotModified 304
HttpResponseBadRequest 400
HttpResponseNotFound 404
HttpResponseForbidden 403
HttpResponseNotAllowed 405
HttpResponseGone 410
HttpResponseServerError 500
3 JsonResponse
若要返回json数据,可以使用JsonResponse来构造响应对象,作用:
1. 帮助我们将数据转换为json字符串
2. 设置响应头Content-Type为application/json
例:
from django.http import JsonResponse
def response(request):
return JsonResponse({'city': 'beijing', 'subject': 'python'})
实例:显示成字典
from django.http import JsonResponse
data = {'name':'zongwenbo'}
return JsonResponse(data)
4 redirect重定向 ,跳转页面
from django.shortcuts import redirect
def response(request):
return redirect('/get_header')