Django–視圖層

1 視圖函數

一個視圖函數是一個簡單的python函數,它接受Web請求並返回Web響應。響應能夠是一張網頁的HTML內容,一個重定向、一個404錯誤或一張圖片。html

視圖層應掌握兩個對象:請求對象(request)響應對象(HttpResponse)前端

2 Request對象

form表單,不寫method,默認是get請求python

(1)什麼狀況下用get:請求數據,請求頁面django

(2)什麼狀況下用post:向服務器提交數據json

request屬性

掌握:
1.request.GET

  一個相似於字典的對象,包含 HTTP GET 的全部參數。

2.request.POST

  一個相似於字典的對象,若是請求中包含表單數據,則將這些數據封裝成 QueryDict 對象。

  POST 請求能夠帶有空的 POST 字典 —— 若是經過 HTTP POST 方法發送一個表單,可是表單中沒有任何的數據,QueryDict 對象依然會被建立。
   所以,不該該使用 if request.POST  來檢查使用的是不是POST 方法;應該使用 if request.method == "POST"
  另外:若是使用 POST 上傳文件的話,文件信息將包含在 FILES 屬性中。
   
   注意:鍵值對的值是多個的時候,好比checkbox類型的input標籤,select標籤,須要用:
        request.POST.getlist("hobby")

3.request.body

  一個字符串,表明請求報文的主體。在處理非 HTTP 形式的報文時很是有用,例如:二進制圖片、XML,Json等。
  可是,若是要處理表單數據的時候,推薦仍是使用 HttpRequest.POST 。


4. 路徑:http://127.0.0.1:8000/index/xxxx/?name=hanl&password=123

   request.path    
  一個字符串,表示請求的路徑組件(不含域名、內容)  /index/xxxx/  
   
   request.get_full_path()    表示全路徑(包含內容)  /index/xxxx/?name=hanl&password=123
   


5.request.method
   (請求類型)
  一個字符串,表示請求使用的HTTP 方法。必須使用大寫。
  例如:"GET""POST"


7.request.FILES(*****)

  一個相似於字典的對象,包含全部的上傳文件信息。
   FILES 中的每一個鍵爲<input type="file" name="" /> 中的name,值則爲對應的數據。
  注意,FILES 只有在請求的方法爲POST 且提交的<form> 帶有enctype="multipart/form-data" 的狀況下才會
   包含數據。不然,FILES 將爲一個空的相似於字典的對象。

-----------------------------------------------------------------------------------------------------
瞭解:

8.request.META

   一個標準的Python 字典,包含全部的HTTP 首部。具體的頭部信息取決於客戶端和服務器,下面是一些示例:
  取值:

    CONTENT_LENGTH —— 請求的正文的長度(是一個字符串)。
    CONTENT_TYPE —— 請求的正文的MIME 類型。
    HTTP_ACCEPT —— 響應可接收的Content-Type。
    HTTP_ACCEPT_ENCODING —— 響應可接收的編碼。
    HTTP_ACCEPT_LANGUAGE —— 響應可接收的語言。
    HTTP_HOST —— 客服端發送的HTTP Host 頭部。
    HTTP_REFERER —— Referring 頁面。
    HTTP_USER_AGENT —— 客戶端的user-agent 字符串。
    QUERY_STRING —— 單個字符串形式的查詢字符串(未解析過的形式)。
    REMOTE_ADDR —— 客戶端的IP 地址。
    REMOTE_HOST —— 客戶端的主機名。
    REMOTE_USER —— 服務器認證後的用戶。
    REQUEST_METHOD —— 一個字符串,例如"GET""POST"。
    SERVER_NAME —— 服務器的主機名。
    SERVER_PORT —— 服務器的端口(是一個字符串)。
   從上面能夠看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 以外,請求中的任何 HTTP 首部轉換爲 META 的鍵時,
    都會將全部字母大寫並將鏈接符替換爲下劃線最後加上 HTTP_  前綴。
    因此,一個叫作 X-Bender 的頭部將轉換成 META 中的 HTTP_X_BENDER 鍵。

6.request.encoding   一個字符串,表示提交的數據的編碼方式(若是爲 None 則表示使用 DEFAULT_CHARSET 的設置,默認爲 'utf-8')。 這個屬性是可寫的,你能夠修改它來修改訪問表單數據使用的編碼。 接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數據)將使用新的 encoding 值。 若是你知道表單數據的編碼不是 DEFAULT_CHARSET ,則使用它。



9.request.COOKIES

  一個標準的Python 字典,包含全部的cookie。鍵和值都爲字符串。


3 HttpResponse對象

響應對象主要有三種方式:瀏覽器

  • HttpResponse()
  • render()
  • redirect()

HttpResponse()括號內直接跟一個具體的字符串做爲響應體服務器

render()

render(request, template_name[, context])

如:render(request,'book_list.html',{'book_list':book_list})

結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 對象。

參數:cookie

    request: 用於生成響應的請求對象。

    template_name:要使用的模板的完整名稱,可選的參數

    context:添加到模板上下文的一個字典。默認是一個空字典。若是字典中的某個值是可調用的,視圖將在渲染模板以前調用它。

render方法就是將一個模板頁面中的模板語法進行渲染,最終渲染成一個html頁面做爲響應體。

redirect

重定向

redirect(‘/index/’) 
也能夠是一個完整的URL:
redirect('http://www.baidu.com/') 

重定向301和302的區別:
都表示重定向,就是瀏覽器在拿到服務器的這個狀態碼後會自動跳轉到一個新的URL
   (用戶看到的效果就是他輸入的地址A瞬間變成了另外一個地址B)——這是它們的共同點。
他們不一樣在於:
      301表示就地址A的資源已經被永久移除(這個資源不能夠訪問了),
 搜索引擎在抓取新內容的同時也將舊的網址交換爲重定向以後的網址;
      302表示舊地址A的資源還在(仍然能夠訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓 取新的內容而保存舊的網址。

4 JsonResponse

想前端返回一個json格式字符串的兩種方式:
方式一:
dic={'name':'byz','age':18}
 li=[1,2,3,4]
return HttpResponse(json.dumps(li))
方式二:
from django.http import JsonResponse
dic={'name':'byz','age':18}
return JsonResponse(dic,safe=False)

5 CBV和FBV

CBV基於類的視圖(Class base view)和FBV基於函數的視圖(Function base view)函數

from django.views import View
class AddPublish(View):
    def dispatch(self, request, *args, **kwargs):
        print(request)
        print(args)
        print(kwargs)
        # 能夠寫相似裝飾器的東西,在先後加代碼
        obj=super().dispatch(request, *args, **kwargs)
        return obj

    def get(self,request):
        return render(request,'index.html')
    def post(self,request):
        request
        return HttpResponse('post')

6 簡單文件上傳

1 <form action="" method="post" enctype="multipart/form-data">
    用戶名:<input type="text" name="name">
    密碼:<input type="text" name="password">
    文件:<input type="file" name="myfile">
    <input type="submit">

    </form>
    #enctype="multipart/form-data"*******************重點
    #<input type="file" name="myfile">****必定要指定name
    
2   # ff是一個文件對象,django封裝的
    ff=request.FILES.get('myfile')
    # 文件對象的名字
    file_name=ff.name
    from django.core.files.uploadedfile import InMemoryUploadedFile
    print(type(ff))
    with open(file_name,'wb') as f:
        for line in ff.chunks():  
            f.write(line)
            
    return HttpResponse('ok)
相關文章
相關標籤/搜索