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裏面

相關文章
相關標籤/搜索