Django 視圖層

一.虛擬環境

PyCharm可使用virtualenv中的功能來建立虛擬環境。PyCharm緊密集成了virtualenv,因此只須要在setting中配置便可建立虛擬環境。並且PyCharm捆綁了virtualenv,咱們不須要單獨安裝,通常建立過程以下:php

1.進入Project Interpreters頁面html

file----->settings----->Project----->Project InterPreters前端

點擊紅色框選擇---Add Local..進入下面的界面python

解釋圖中標識處
1.選擇一個本地的空目錄,該目錄就做爲python虛擬環境目錄.
2,選擇本地python解釋器安裝的路徑
3.勾選該選項則可使用base interpreter中的第三方庫,不選將和外界徹底隔離
4.勾選該選項則可將虛擬環境提供給其餘項目使用

二.視圖函數

視圖函數,簡稱視圖,是一個簡單的python函數,它接收Web請求並返回Web響應。響應能夠是一張網頁的HTML內容,一個重定向,404錯誤等如何東西,可是,不管視圖自己是個什麼處理邏輯,最好都返回某種響應。代碼寫在哪裏也無所謂,只要它在你的Python目錄下,除此以外沒有更多的要求。爲了將代碼放在某處,約定是將視圖放置在項目或應用程序目錄中的名爲views.py的文件中。

下面是一個返回當前日期和時間做爲HTML文檔的視圖:ajax

from django.shortcuts import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = '<html><body>It is now %s</body></html>'%now
    return HttpResponse(html)

逐行閱讀上面的代碼:數據庫

  • 首先,從django.shortcuts模塊導入了HttpResponse類,以及Python的datetime類
  • 接着,定義了一個名爲current_datetime的函數。它就是視圖函數,每一個視圖函數都使用HttpRequest對象做爲第一個參數,而且一般稱爲request。注意,視圖函數的名稱並不重要;不須要用一個統一的命名方式來命名,以便讓Django識別它.
  • 這個視圖會返回一個HttpResponse對象,其中包含生成的響應,每一個視圖函數都負責返回一個HttpResponse對象

三.HttpRequest對象

request屬性

django將請求報文中的請求行、首部信息、內容主題封裝成HttpRequest類中的屬性,除了特殊說明以外,其餘的均爲只讀的。django

1.HttpRequest.GET
    一個相似於字典的對象,包含HTTP GET的全部參數,詳情參考QueryDict對象
2.HttpRequest.POST
    一個相似於字典的對象,若是請求中包含表單數據,則將這些數據封裝成QueryDict對象
    POST請求能夠帶有空的POST字典,若是經過HTTP POST方法發送一個表單,可是表單中沒有任何的數據,QueryDict對象依然會被建立,所以,不該該使用if request.POST 來檢查使用的是不是POST方法,應該使用if request.method == 'POST'
    注意:鍵值對的值是多個的時候,好比checkbox類型的input標籤,select標籤,須要用:
    request.POST.getlist('hobby')
3.HttpRequest.body
    一個字符串,表明請求報文的主體。在處理非HTTP形式的報文時很是有用,例如:二進制圖片,XML,Json等,可是,若是要處理表單數據的時候,推薦仍是使用HttpRequest.POST
4.HttpRequest.path
    一個字符串,表示請求的路徑組件(不含域名)
    例如:'/study/book/addbook'
5.HttpRequest.method
    一個字符串,表示請求使用的HTTP方法,必須使用大寫
    例如:'GET','POST'
6.HttpRequest.encoding
    一個字符串,表示提交的數據的編碼方式(若是爲None則表示使用DEFAULT_CHARSET設置).這個屬性是可寫的,能夠經過修改他來改變表單數據的編碼,任何隨後的屬性訪問將使用新的編碼方式.
7.HttpRequest.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 鍵。
8.HttpRequest.FILES
    一個相似於字典的對象,包含全部的上傳文件信息
    FILES中的每一個鍵爲<input type="file" name="" />中的name,值則爲對應的數據,
    注意,FILES只有在請求的方法爲POST且提交的<form>帶有enctype="multipart/form-data"的狀況下才會包含數據。不然,FILES將爲一個空的相似於字典的對象。
9.HttpRequest.COOKIES
    一個標準的Python字典,包含全部的cookie,鍵和值都爲字符串
10.HttpRequest.session
    SessionMiddleware中間件:一個既可讀又可寫的相似於字典的對象,表示當前的會話,只有當Django啓用會話的支持時纔可用
11.HttpRequest.user
    AuthenticationMiddleware
    一個 AUTH_USER_MODEL 類型的對象,表示當前登陸的用戶。

  若是用戶當前沒有登陸,user 將設置爲 django.contrib.auth.models.AnonymousUser 的一個實例。你能夠經過 is_authenticated() 區分它們。

    例如:

    if request.user.is_authenticated():
        # Do something for logged-in users.
    else:
        # Do something for anonymous users.


       user 只有當Django 啓用 AuthenticationMiddleware 中間件時纔可用。

     -------------------------------------------------------------------------------------

    匿名用戶
    class models.AnonymousUser

    django.contrib.auth.models.AnonymousUser 類實現了django.contrib.auth.models.User 接口,但具備下面幾個不一樣點:

    id 永遠爲None。
    username 永遠爲空字符串。
    get_username() 永遠返回空字符串。
    is_staff 和 is_superuser 永遠爲False。
    is_active 永遠爲 False。
    groups 和 user_permissions 永遠爲空。
    is_anonymous() 返回True 而不是False。
    is_authenticated() 返回False 而不是True。
    set_password()、check_password()、save() 和delete() 引起 NotImplementedError。
    New in Django 1.8:
    新增 AnonymousUser.get_username() 以更好地模擬 django.contrib.auth.models.User。

request經常使用方法

1.HttpRequest.get_full_path()
    返回完成參數列表的path,若是能夠將加上查詢字符串,例如:"/music/bands/the_beatles/?print=true"
2.HttoRequest.is_ajax()
    若是請求是經過XMLHttpRequest發起的,則返回True.方法是檢查HTTP_X_REQUESTED_WITH相應的首部是不是字符串'XMLHttpRequest'
    大部分現代的 JavaScript 庫都會發送這個頭部。若是你編寫本身的 XMLHttpRequest 調用(在瀏覽器端),你必須手工設置這個值來讓 is_ajax() 能夠工做。
  若是一個響應須要根據請求是不是經過AJAX 發起的,而且你正在使用某種形式的緩存例如Django 的 cache middleware,
   你應該使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 裝飾你的視圖以讓響應可以正確地緩存。

四.HttpResponse對象

相應對象主要有三種形式:json

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

HttpResquest()括號內直接跟一個具體的字符串做爲相應體,比較直接很簡單,因此這裏主要介紹後面兩種形式.數組

1.HttpRespnse()

使用方法:
    最簡單的方式是傳遞一個字符串做爲頁面的內容到HttpResponse構造函數,並返回給用戶,如:
    response = HttpResponse("Here is the of the Web page")
    #response = HttpResponse("Text only, please",content_type="text/plain")
    return response
    能夠將response看作一個類文件對象,使用wirte()方法不斷地往裏面增長內容
    response = HttpResponse()
    response.write("<p>Here's the text of the Web page.</p>")
    return response

2.rednder()

render(request, template_name[, context])
結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的HttpResponse對象
參數:
    request: 用於生成響應的請求對象
    template_name: 要使用的模板的完整名稱,可選的參數
    context: 添加到模板上下文的一個字典,默認是一個空字典,若是字典中的某個值是可調用的,視圖將在渲染模板以前調用它.
    render方法就是將一個模板頁面中的模板語法進行渲染,最後渲染成一個html頁面做爲響應體

3.redirect()

傳遞要重定向的一個硬編碼的URL
def my_view(request):
    ...
    return redirect('/some/url/')
也能夠是一個完整的URL:
def my_view(request):
    ...
    return redirect('http://www.baidu.com/')
重定向緣由:
    1.網站調整(如改變網頁目錄結構)
    2.網頁被移到一個新地址
    3.網頁擴展名改變(如應用須要把.php改爲.Html或.shtml)
    這種狀況下,若是不作重定向,則用戶收藏夾或搜索引擎數據庫中舊地址只能讓訪問客戶獲得一個404頁面錯誤信息,訪問流量白白喪失;再者某些註冊了多個域名的網站,也須要經過重定向讓訪問這些域名的用戶自動跳轉到主站點等.

五.JsonResponse

向前端返回一個json格式字符串的兩種方式瀏覽器

#第一種方式
import json
data1 = {"name":"Yven","age":18}
data2 = ["Yven","abc"]
return HttpResponse(json.dumps(data1))
return HttpResponse(json.dumps(data2)) #報錯,默認不支持列表類型也就是數組類型
return HttpResponse(json.dumps(data2),safe=False) #將safe設置爲False就能夠了

#第二種方式
from django.http import JsonResponse
return JsonResponse(data2,safe=False)

六.CBV和FBV

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

#路由層
url(r"^test/",views.AddPublish.as_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):
        return HttpResponse('post')

七.簡單文件上傳

前端

<form action="" method="post" enctype="multipart/form-data">
{# <form action="" method="post" enctype="application/x-www-form-urlencoded"> #}
    <input type="file" name="myfile">
    <input type="text" name="password">
    <input type="submit" value="提交">
</form>

後臺

def fileupload(request):
    if request.method == "GET":
        return render(request,"fileupload.html")
    if request.method == "POST":
        # 從字典種根據名字,把文件取出來
        myfile = request.FILES.get("myfile")
        name = myfile.name
        # 打開文件,把上傳過來的文件保存到本地
        with open(name,"wb") as f:
            for line in myfile:
                f.wirte(line)
        return HttpResponse('ok')
相關文章
相關標籤/搜索