一、Django中的视图
CBV和FBV
我们之前写过的都是基于函数的view,就叫FBV。还可以把view写成基于类的。
1
|
url(r
'^add_publisher/'
,views.AddPublisher.as_view)
|
在views里添加
1
2
3
4
5
6
7
8
9
10
11
|
from
django.views import View
class
AddPublisher(View):
def
get
(self, request):
return
render(request,
'add_publisher.html'
)
def post(self,request):
new_name =request.POST.
get
(
'publisher_name'
,None)
if
new_name:
models.Publisher.objects.create(name=new_name)
else
:
error_msg =
"出版社名称不存在"
return
render(request,
'add_publisher.html'
,{
'error'
:error_msg})
|
Request对象
请求相关的常用值
- path_info 返回用户访问url,不包括域名
- method 请求中使用的HTTP方法的字符串表示,全大写表示。
- GET 包含所有HTTP GET参数的类字典对象
- POST 包含所有HTTP POST参数的类字典对象
- body 请求体,byte类型 request.POST的数据就是从body里面提取到的
2. request对象
1. 之前学过的
1. request.method --> 获取请求的方法(GET、POST等)
2. request.GET --> 通常用来获取URL里面的参数
127.0.0.1:8000/edit_book/?id=1&name=yimi
request.GET --> {"id":1, "name":"yimi"}
request.GET.get("id")
3. request.POST --> 用来获取POST提交过来的数据
request.POST.get("book_name")
2. 补充其他常用的:
1. request.path_info --> 获取用户请求的路径(不包含IP和端口和URL参数)
2. request.body
3. response
基础必备三件套(求学要严谨)
1. HttpResponse --> 返回字符串内容
2. render --> 返回一个html页面
3. redirect --> 返回一个重定向(告诉浏览器再去访问另外的网址)
4. JsonResponse
三、Response对象
与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。
html文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!DOCTYPE html>
<html lang=
"en"
>
<head>
<meta charset=
"UTF-8"
>
<title>upload</title>
</head>
<body>
<form action=
"/upload/"
method=
"post"
enctype=
"multipart/form-data"
>
<input type=
"file"
name=
"upload_file"
>
<input type=
"submit"
value=
"开始上传"
>
</form>
</body>
</html>
|
url(r'^upload/',views.upload)
views文件
下面def upload(request):
if request.method =='POST': print(request.FILES) 下面是print request.FILES的值 <MultiValueDict: {'upload_file': [<TemporaryUploadedFile: 02 python fullstack s10 day08 集合.avi (video/avi)>]}> print(request.FILES['upload_file'].name ) #拿到文件的名字 python fullstack s10 day08 集合.avi file_name = request.FILES['upload_file'].name #拿到文件的名字 with open(file_name,'wb')as f: for chunk in request.FILES['upload_file'].chunks(): f.write(chunk) return HttpResponse('上传OK') else: return render(request, 'upload_file.html')
jason
url(r'^json_data/',views.json_test),
def json_test(request): data ={'name':'小黑','age':19} import json data_str =json.dumps(data) #把data序列化成json格式的字符串 return HttpResponse(data_str)
def json_test(request): data ={'name':'小黑','age':19} data2 =[1,2,3,45,6,5] # import json # data_str =json.dumps(data) #把data序列化成json格式的字符串 # return HttpResponse(data_str) from django.http import JsonResponse return JsonResponse(data2) #这个代码会报错,因为只接受字典的 形式。 return JsonResponse(data,safe =False)
Django shortcut functions
1
|
url(r
'^book/[0-9]{2,4}/$'
,views.book),
|
1
|
url(r
'^book/([0-9]{2,4})/([a-zA-Z]{2})/$'
,views.book)
|
1
2
3
4
|
def book(request,arg1,arg2):#传三个参数
print(
'arg1:'
,arg1)
print(
'arg2:'
,arg2)
return
HttpResponse(
'口哥说一个 '
)
|
案例分析
# url(r'^publisher_del/',views.publisher_del), url(r'^publisher_del/[0-9]+',views.publisher_del),
# def publisher_del(request):##只传一个参数 # del_id =request.GET.get('id') # models.Publisher.objects.get(id=del_id).delete() # print(111) # return redirect('/publisher_list/') # URL分组匹配 def publisher_del(request,del_id): #传两个参数 models.Publisher.objects.get(id=del_id).delete() print(111) return redirect('/publisher_list/')