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將請求報文中的請求行、首部信息、內容主題封裝成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。
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') 裝飾你的視圖以讓響應可以正確地緩存。
相應對象主要有三種形式:json
HttpResquest()括號內直接跟一個具體的字符串做爲相應體,比較直接很簡單,因此這裏主要介紹後面兩種形式.數組
使用方法: 最簡單的方式是傳遞一個字符串做爲頁面的內容到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
render(request, template_name[, context]) 結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的HttpResponse對象 參數: request: 用於生成響應的請求對象 template_name: 要使用的模板的完整名稱,可選的參數 context: 添加到模板上下文的一個字典,默認是一個空字典,若是字典中的某個值是可調用的,視圖將在渲染模板以前調用它. render方法就是將一個模板頁面中的模板語法進行渲染,最後渲染成一個html頁面做爲響應體
傳遞要重定向的一個硬編碼的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頁面錯誤信息,訪問流量白白喪失;再者某些註冊了多個域名的網站,也須要經過重定向讓訪問這些域名的用戶自動跳轉到主站點等.
向前端返回一個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基於類的視圖(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')