文件配置1.模版Templates文件配置: TEMPLATE_DIRS = ( os.path.join(BASE_DIR,'templates'), ) 2.靜態(tài)文件static配置: STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), ) 報錯 doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS\ 這個問題出現(xiàn)沒有在setting INSTALLED_APPS 添加項目名稱引起 Q搜索示例1.利用Q的特性,設計多條件搜索。 ![]() ![]() ![]() 注意: 1.后端得到數(shù)據(jù)返回給前端ajax時,需要序列化操作,將字符串返回給前端。 2.序列化操作時,注意json默認只能轉換字典,列表,元組等對象,如果為時間,小數(shù)等對象,需要自定義擴展轉換成字符串。 3.表單提交中的url地址,末尾需要帶上/。 如(action="/form1/") 序列化1、serializers
2、json.dumps
由于json.dumps時無法處理datetime日期,所以可以通過自定義處理器來做擴展,如: ![]() FormDjango中的Form一般有兩種功能、用途:
1. 后端創(chuàng)建input標簽,輸入html,瀏覽器不同,表現(xiàn)不同,步驟如下: ![]() ![]() ![]() 生成的標簽,可以設置屬性值: user_type_choice = ( (0, u'普通用戶'), (1, u'高級用戶'), ) user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,attrs={'class': "form-control"})) title = forms.CharField(widget=forms.TextInput(attrs={'class': "form-control",'placeholder': u'標題5-20個字符'})) memo = forms.CharField(widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'詳細描述', 'rows': 3})) ![]() 注意: 1.類里靜態(tài)字段 只在第一遍執(zhí)行!, 如果動態(tài)綁定了數(shù)據(jù),生成后就不再修改了! class Form1(forms.Form): def __init__(self,*args, **kwargs): super(Form1, self).__init__(*args, **kwargs) self.fields['book_type'] = forms.CharField( widget=forms.widgets.Select(choices=models.BookType.objects.values_list('id','caption'),attrs={'class': "form-control"})) ![]() 2. 驗證用戶輸入 依據(jù)自定義的Form類,進行判斷用戶輸入是否合法 自定義靜態(tài)字段: class Form1(forms.Form): user = forms.CharField( required=True max_length=20, min_length=5, error_messages={'required': u'標題不能為空', 'min_length': u'標題最少為5個字符', 'max_length': u'標題最多為20個字符', 'invalid': u'標題格式錯誤'}, ) 自定義正則規(guī)則: from django import forms import re from django.core.exceptions import ValidationError def mobile_validate(value): mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') if not mobile_re.match(value): raise ValidationError('手機號碼格式錯誤') class Form1(forms.Form): phonenum= forms.CharField( validators=[mobile_validate, ], ) 后端驗證方法: (需要傳入request.POST) from app01.forms import Form1 def form1(request): if request.method == 'POST': # 獲取請求內(nèi)容,做驗證 f = Form1(request.POST) if f.is_valid(): print(f.cleaned_data) else: # print(f.errors.get('user',None)) # print(f.errors['pwd'][0]) # print(type(f.errors),f.errors)return render(request, 'account/form1.html',{'error': f.errors,'form':f}) else: f = Form1() return render(request, 'account/form1.html',{'form':f}) Cookie1、獲取Cookie:
2、設置Cookie:
由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。
SessionDjango中默認支持Session,其內(nèi)部提供了5種類型的Session供開發(fā)者使用:
1、數(shù)據(jù)庫Session ![]() ![]() 2、緩存Session ![]() 3、文件Session ![]() 4、緩存+數(shù)據(jù)庫Session ![]() 5、加密cookie Session ![]() 擴展:Session用戶驗證
分頁一、Django內(nèi)置分頁 二、自定義分頁 csrf跨站請求偽造django為用戶實現(xiàn)防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對于django中設置防跨站請求偽造功能有分為全局和局部。 全局: 中間件 django.middleware.csrf.CsrfViewMiddleware 局部:
注: 需要引入
二、應用 1、普通表單
2、Ajax 1.對于傳統(tǒng)的form,可以通過表單的方式將token再次發(fā)送到服務端,而對于ajax的話,添加請求頭 2.為了方便,獲取cookie,需要用到 jquery.cookie.js 文件提供的$.cookie()方法 var csrftoken = $.cookie('csrftoken'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); 更多:https://docs./en/dev/ref/csrf/#ajax admindjango amdin是django提供的一個后臺管理頁面,改管理頁面提供完善的html和css,使得你在通過Model創(chuàng)建完數(shù)據(jù)庫表之后,就可以對數(shù)據(jù)進行增刪改查,而使用django admin 則需要以下步驟:
1、創(chuàng)建后臺管理員
2、配置后臺管理url
3、注冊和配置django admin 后臺管理頁面 a、在admin中執(zhí)行如下配置 ![]() b、設置數(shù)據(jù)表名稱 ![]() c、打開表之后,設定默認顯示,需要在model中作如下配置 ![]() ![]() d、為數(shù)據(jù)表添加搜索功能 ![]() e、添加快速過濾 ![]() 更多:http://docs./djangobook2/chapter06/ 中間件django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束后,django會根據(jù)自己的規(guī)則在合適的時機執(zhí)行中間件中相應的方法。 在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一個中間件,如下圖。 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] 中間件中可以定義方法,分別是:
以上方法的返回值可以是None和HttpResonse對象,如果是None,則繼續(xù)按照django定義的規(guī)則向下執(zhí)行,如果是HttpResonse對象,則直接將該對象返回給用戶。 自定義中間件1、創(chuàng)建中間件類
2、注冊中間件
3、執(zhí)行流程 : request -> view -> url 選擇器 -> views 函數(shù) -> response (倒序 return ) request => 下一個 request => ..... => 如果有 return Httpresponse => response => 用戶頁面 -> view -> url 選擇器 -> views 函數(shù) -> 沒有 render -> response -> 用戶 有 render -> template -> response -> 用戶 -> 函數(shù)有異常 -> exception (倒序 return ) -> response 緩存由于Django是動態(tài)網(wǎng)站,所有每次請求均會去數(shù)據(jù)進行相應的操作,當程序訪問量大時,耗時必然會更加明顯,最簡單解決方式是使用:緩存,緩存將一個某個views的返回值保存至內(nèi)存或者memcache中,5分鐘內(nèi)再有人來訪問時,則不再去執(zhí)行view中的操作,而是直接從內(nèi)存或者Redis中之前緩存的內(nèi)容拿到,并返回。 Django中提供了6種緩存方式:
1、配置 a、開發(fā)調(diào)試 ![]() b、內(nèi)存 ![]() c、文件 ![]() d、數(shù)據(jù)庫 ![]() e、Memcache緩存(python-memcached模塊) ![]() f、Memcache緩存(pylibmc模塊) ![]() 2、應用 a. 全站使用 ![]() b. 單獨視圖緩存 ![]() c、局部視圖使用 ![]() 更多:猛擊這里 信號Django中提供了“信號調(diào)度”,用于在框架執(zhí)行操作時解耦。通俗來講,就是一些動作發(fā)生的時候,信號允許特定的發(fā)送者去提醒一些接受者。 1、Django內(nèi)置信號
對于Django內(nèi)置的信號,僅需注冊指定信號,當程序執(zhí)行相應操作時,自動觸發(fā)注冊函數(shù): 注冊的信號放在__init__文件中即可實現(xiàn). ![]() views函數(shù)調(diào)用: ![]() 2、自定義信號 a. 定義信號
b. 注冊信號
c. 觸發(fā)信號
由于內(nèi)置信號的觸發(fā)者已經(jīng)集成到Django中,所以其會自動調(diào)用,而對于自定義信號則需要開發(fā)者在任意位置觸發(fā)。 更多:猛擊這里 Form上傳文件a、自定義上傳 def upload_file(request): if request.method == "POST": obj = request.FILES.get('fafafa') f = open(obj.name, 'wb') for chunk in obj.chunks(): # chunks() 返回bytes類型 f.write(chunk) f.close() return render(request, 'file.html') b、Form上傳文件實例 ![]() ![]() ![]()
|
|
來自: highoo > 《數(shù)據(jù)分析》