一、使用Pycharm除錯Django專案
- 1、在當前專案下打開Run->Edit Configurations
- 2、點擊+,選擇新增python 腳本,如圖,填好name,script,script parameter

這里的Parameter為runserver,也就是manange.py運行的時候需要追加的引數,完整命令為
python manage.py runserver (127.0.0.1:8000 可選),
所以對于一些執行時候需要使用parser決議命令的腳本同樣可以使用相同的方式配置除錯, - 3、在專案需要的除錯代碼行打上斷點,當有請求到達的時候就會開啟除錯,一般為路由中,
二、CORS跨域配置
1、跨域問題簡介
跨域指的是瀏覽器不能執行其他網站的腳本,它是由瀏覽器的同源策略造成的,協議,域名,埠都要相同,其中有一個不同都會產生跨域;
跨域主要有應用在前后端分離的時候,比如Vue+Django,Vue本身由于node的支持,在本地運行的時候會占用localhost:8080,Django后端有自己的服務器占用localhost:8000,前端后端想要聯調,就會有跨域問題產生,可以使用CORS(Cross-Origin Resource Sharing),跨域資源共享解決,
大概原理:當使用XMLHttpRequest發送請求時,如果瀏覽器發現違反了同源策略就會自動加上一個請求頭 origin;后端在接受到請求后確定回應后會在 Response Headers 中加入一個屬性 Access-Control-Allow-Origin;瀏覽器判斷回應中的 Access-Control-Allow-Origin 值是否和當前的地址相同,匹配成功后才繼續回應處理,否則報錯,
CORS解釋
2、前后聯調的配置
Django需要專案環境下安裝對應模塊
pip install django-cors-headers
專案setting.py組態檔添加配置
# settings.py
INSTALLED_APPS = [
...
'corsheaders', # demo
'rest_framework',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 需注意與其他中間件順序,這里放在最前面即可
...
]
# 支持跨域配置開始
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
- INSTALLED_APPS中要注意添加的模塊
'corsheaders',后面不要少逗號,否則專案初始化加載settings.py的時候會做字串拼接為corsheaderrest_frame因找不到模塊從而報錯, - MIDDLEWARE中添加的中間件
corsheaders.middleware.CorsMiddleware要放到第一個位置,因為在請求經過中間件的時候,是按照MIDDLEWARE中的順序,如果不符合某一個中間件定義則直接終止,
前端Vue需要安裝axios模塊
cnpm install axios
然后Vue需要對請求做統一管理,可以再vue專案下/src/創建一個/api/api.js,請求頭和請求路徑配置,比如超時時間,Content-Type回應頭,封裝get或者post方法等,
//前端同學寫的
import axios from 'axios';
axios.defaults.timeout = 5000; //超市時間是5秒
axios.defaults.withCredentials = true; //允許跨域
//Content-Type 回應頭
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
//基礎url
axios.defaults.baseURL = "http://localhost:8000";
/**
* 封裝get方法
*/
export function get(url,params={}){
return new Promise((resolve,reject) => {
axios.get(url,{params:params})
.then(response =>{
resolve(response.data);
})
.catch(err =>{
reject(err);
})
});
}
具體Vue與Django前后端聯調參考demo:傳送門
三、Django中request針對不同Content-Type的決議
后端使用一般要拿到http封裝的request做路由處理,但是不同的request的body內容格式也不同,要個請求header中定義的Content-Type進行決議,路由函式中可以根據requet.META獲取到http請求的請求頭,
請求頭中的內容長度與內容型別:
- CONTENT_LENGTH – The length of the request body (as a string).
- CONTENT_TYPE – The MIME type of the request body.
Content-Type兩種重要的格式:
- x-www-form-urlencoded:表單內的資料轉化內鍵值對,也只能上傳鍵值對,并且鍵值對都是間隔分開的,
- raw:可以上傳任意格式的文本,可以上傳text、json、xml、html等,其實主要的還是傳遞json格式的資料,當后端要求json資料格式的時候,就要使用此種格式來測驗,
1、x-www-form-urlencoded格式

當content-type為x-www-form-urlencoded的時候,直接使用request.POST.get('username')的方式可以獲取對應欄位的值

2、raw格式
content-type為raw格式,則需要先將request.body中內容先進行解碼為獲取欄位得值,
postbody = request.body
json_param = json.loads(postbody.decode())
username = json_param.get('username','')
password = json_param.get('password','')
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/349486.html
標籤:Python
