modelform跨站請求
阿新 • • 發佈:2020-07-23
csrf 跨站請求偽造
1 ajax({ 2 3 data:{csrfmiddlewaretoken:$('[name=csrfmiddlewaretoken]').val(), 4 // csrfmiddlewaretoken:'{{ csrf_token }}', 5 } 6 }) 7 ajax({ 8 9 url:'/test/', 10 type:'post', 11 headers:{ 12 "X-CSRFToken": $.cookie('csrftoken'),13 }, 14 })
jquery操作cookie,檔案地址http://plugins.jquery.com/cookie/
https://www.cnblogs.com/clschao/articles/10480029.html
1 <script src="{% static 'jquery.js' %}"></script>
2 <script src="{% static 'jquery.cookie.js' %}"></script>
同源機制
1 瀏覽器的一個安全機制,非同源不允許直接互相訪問,同源:協議,域名(ip地址),埠號三項相同才是同源2 3 簡單請求和複雜請求 4 簡單請求: 5 (1) 請求方法是以下三種方法之一:(也就是說如果你的請求方法是什麼put、delete等肯定是非簡單請求) 6 HEAD 7 GET 8 POST 9 (2)HTTP的頭資訊不超出以下幾種欄位:(如果比這些請求頭多,那麼一定是非簡單請求) 10 Accept 11 Accept-Language 12 Content-Language 13 Last-Event-ID 14 Content-Type:只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain,也就是說,如果你傳送的application/json格式的資料,那麼肯定是非簡單請求,vue的axios預設的請求體資訊格式是json的,ajax預設是urlencoded的。15 16 簡單請求只發送一次請求 17 18 19 複雜請求(非簡單請求) 傳送兩次請求 20 21 22 * 簡單請求和非簡單請求的區別? 23 24 簡單請求:一次請求 25 非簡單請求:兩次請求,在傳送資料之前會先發一次請求用於做“預檢”,只有“預檢”通過後才再傳送一次請求用於資料傳輸。 26 * 關於“預檢” 27 28 - 請求方式:OPTIONS 29 - “預檢”其實做檢查,檢查如果通過則允許傳輸資料,檢查不通過則不再發送真正想要傳送的訊息 30 - 如何“預檢” 31 => 如果複雜請求是PUT等請求,則服務端需要設定允許某請求,否則“預檢”不通過 32 Access-Control-Request-Method 33 => 如果複雜請求設定了請求頭,則服務端需要設定允許某請求頭,否則“預檢”不通過 34 Access-Control-Request-Headers 35 36 37 請求的網站響應內容: 38 def index(request): 39 a = {'name':'chao'} 40 ret = JsonResponse(a) 41 ret["Access-Control-Allow-Origin"] = "http://127.0.0.1:8000" #讓http://127.0.0.1:8000這個網址的所有請求都能通過同源機制獲得我給他響應的資料 42 ret["Access-Control-Allow-Origin"] = "*" 43 ret["Access-Control-Allow-Origin"] = "http://127.0.0.1:8000,http://127.0.0.1:8001," 44 ret["Access-Control-Allow-Headers"] = "content-type" #讓所有的請求資料格式都能通過同源機制, 45 return ret
modelform 通過model的屬性自動翻譯成form的屬性,來進行form元件的工作
1 from django.core.exceptions import ValidationError 2 class BookModelForm(forms.ModelForm): 3 # title=forms.CharField(max_length=15,min_length=6) 4 5 class Meta: 6 model = models.Book 7 # fields=['title','publishs',] 8 fields='__all__' 9 # exclude = ['title','xx',] 10 11 labels = { 12 'title':'書名', 13 'publishDate':'出版日期', 14 } 15 widgets = { 16 'publishDate':forms.widgets.TextInput(attrs={'type':'date'}), 17 } 18 error_messages = { 19 'title':{'required':'不能為空',}, 20 'publishDate':{'required':'不能為空',} 21 } 22 23 # def clean_title(self): 24 # value = self.cleaned_data.get('title') 25 # if '666' in value: 26 # raise ValidationError('光喊6是不行的!!') 27 # else: 28 # return value 29 # def clean(self): 30 # ... 31 #批量新增標籤樣式 32 def __init__(self,*args,**kwargs): 33 super().__init__(*args,**kwargs) 34 for field in self.fields.values(): 35 field.widget.attrs.update({'class':'form-control'})