1. 程式人生 > 實用技巧 >modelform跨站請求

modelform跨站請求

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'})