Django框架之第四篇(视图层)--HttpRequest对象、HttpResponse对象、JsonResponse、CBV和FBV、文件上传

视图层html

1、视图函数前端

一个视图函数,简称视图,是一个简单的python函数,它接收web请求而且会返回web响应。响应能够是一张网页的html,一个重定向,或者是一张图片。。。任何东西均可以。不管是什么逻辑,最后都必需要返回响应。python

2、视图层之HttpRequest对象web

django将请求报文中的请求行,首部信息,内容主体封装成HttpRequest类中的属性。除了特殊说明的以外,其余均为只读的。django

# 1.前台Post传过来的数据,包装到POST字典中
request.POST

# 2.前台浏览器窗口里携带的数据,包装到GET字典中
request.GET

# 3.前台请求的方式
request.method

# 4.post提交的数据,body体的内容,前台会封装成:name=lqz&age=18&sex=1
request.body

# 5.取出请求的路径,取不到数据部分
request.path   # /test/blog/

# 6.取出请求的路径,能取到数据部分
request.get_full_path()   # /test/blog?id=1&name=tom

# 7.META,一个标准的Python 字典,包含全部的HTTP 首部
request.META

# 8.一个相似于字典的对象,包含全部的上传文件信息
request.FILES
#FILES 中的每一个键为<input type="file" name="" /> 中的name,值则为对应的数据。
# 注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的状况下才有
# 包含数据。不然,FILES 将为一个空的相似于字典的对象。

3、视图层之HttpResponse对象编程

响应对象主要有三种形式json

HttpResponse()
render()  
redirect()

django视图函数必需要返回一个HttpResponse对象后端

1.render() 浏览器

render结合一个html页面,而且还能经过字典给该页面传递数据,并返回一个渲染后的HttpResponse对象函数式编程

return render(request,'user_list.html',{'user_lists':user_lists})  #'user_lists'传递给页面
第一个参数是用于生成相应的请求对象,第二个参数是使用的模板名称,第三个参数是传递到模板的数据

render内部原理

from django.template import Template,Context
def index(request):
    temp = Template('<h1>{{ user }}</h1>')
    con = Context({"user":{"name":'jason',"password":'123'}})
    res = temp.render(con)
    print(res)
    return HttpResponse(res)

2.redirect()

传递须要重定向的url

def index(request):

    return redirect('/index')  
  或者
  return redirect reverse('index') #这里的index是取得别名

3.HttpResponse()

def test(request):
    
    return HttpResponse('xxx')  #页面显示xxx

4、视图层之JsonResponse对象

前端的json

JSON.stringify()   >>>  json.dumps()

JSON.parse()    >>>>  json.loads()

from django.http import JsonResponse
import json
1.JsonResponse def index(request): data = {'name':'jason怎么样','password':123} return JsonResponse(data,json_dumps_params={'ensure_ascii':False}) #取消中文转换 2.HttpResponse #使用json转换数据格式 def index(request): data = {'name':'jason怎么样','password':123} res = json.dumps(data,ensure_ascii=False) return HttpResponse(res) 3. def index(request): l=[1,2,3,4,5] return JsonResponse(l,safe=False) #若是返回的不是字典,修改safe参数为false便可
  • JsonResponse也是返回给页面的数据,数据格式只能是字典。和HttpResponse相似,只是返回的数据格式不同。
  • 若是是其余类型数据,须要设置safe = False

 5、FBV和CBV

FBV和CBV   视图函数并不仅是指函数,也能够是类

  FBV(基于函数的视图)  面向函数式编程

  CBV(基于类的视图)    面向对象式编程

基于CBV的视图get请求来就会走类里面的get方法,post请求来就会走类里面的post方法

须要注意的几点设置:

1.urls.py

url(r'^login/',views.MyLogin.as_view())

2.views.py(get请求就走get方法,post请求就走post方法)

from django.views import View

class MyLogin(View):
      def get(self,request):
           print("from MyLogin get方法")
           return render(request,'login.html')
      def post(self,request):
           return HttpResponse("from MyLogin post方法")

 基于FBV的视图

#路由层
url(r'test/',views.test)

#视图层
def test(request):

    return HttpResponse('test')

6、文件上传

form表单上传文件须要注意的事项

    1.enctype须要由默认的urlencoded变成formdata

    2.method须要由默认的get变成post

    (目前还须要考虑的是提交post请求须要将配置文件中的csrf中间件注释)

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
    <input type="text" name="password">
    <input type="submit" value="提交">
</form>

form表单上传文件,后端须要在request.FILES获取文件数据,而再也不是POST里面

相关文章
相关标签/搜索