一文帶你徹底掌握Python前后端跨域問題的解決方法
跨域問題是每個(gè)前后端分離開發(fā)者都會(huì)遇到的“攔路虎”。本文將從瀏覽器同源策略講起,結(jié)合Python后端(Django/Flask/FastAPI)的實(shí)戰(zhàn)配置,幫你徹底搞懂CORS的原理與解決方案。
前言
在前后端分離的開發(fā)模式日益普及的今天,跨域資源訪問(CORS,Cross-Origin Resource Sharing)問題幾乎是每個(gè)開發(fā)者都會(huì)遇到的挑戰(zhàn)。當(dāng)你歡快地在Vue或React項(xiàng)目中調(diào)用后端API,卻看到瀏覽器控制臺(tái)報(bào)出鮮紅的跨域錯(cuò)誤時(shí),那種挫敗感想必很多人都經(jīng)歷過。
本文將從跨域問題的本質(zhì)出發(fā),深入淺出地講解其原理,并重點(diǎn)圍繞Python后端框架(Django、Flask、FastAPI)給出詳盡的解決方案。無論你是剛?cè)腴T的新手,還是經(jīng)驗(yàn)豐富的開發(fā)者,都能從中找到適合自己的跨域處理方案。
第一章:跨域問題本質(zhì)剖析
1.1 什么是同源策略?
在理解跨域之前,我們首先要了解瀏覽器的同源策略(Same-Origin Policy) 。這是瀏覽器施加的一種安全限制,它規(guī)定:只有在協(xié)議、域名、端口完全一致的情況下,頁面才能訪問另一個(gè)頁面的資源 。
舉個(gè)簡單的例子:
- 頁面地址:
http://localhost:5173(Vue項(xiàng)目默認(rèn)端口) - API地址:
http://localhost:8080(后端接口地址)
雖然域名都是localhost,但端口不同(5173 vs 8080),這就構(gòu)成了跨域。瀏覽器會(huì)拒絕前端頁面訪問這個(gè)API 。
1.2 為什么要有同源策略?
同源策略的存在是為了保護(hù)用戶的數(shù)據(jù)安全。如果沒有這個(gè)限制,惡意網(wǎng)站就可以通過腳本任意訪問其他網(wǎng)站的敏感數(shù)據(jù)(如Cookie、LocalStorage等) 。比如,你在瀏覽銀行網(wǎng)站的同時(shí)打開了另一個(gè)惡意網(wǎng)站,如果沒有同源策略,這個(gè)惡意網(wǎng)站就可能通過腳本獲取你在銀行網(wǎng)站的登錄憑證。
1.3 什么是跨域資源共享(CORS)?
為了解決合法的跨域需求,W3C制定了跨域資源共享(CORS,Cross-Origin Resource Sharing) 標(biāo)準(zhǔn)。CORS允許服務(wù)器聲明哪些外部源可以訪問其資源,通過一套HTTP頭信息來實(shí)現(xiàn)瀏覽器與服務(wù)器之間的跨域數(shù)據(jù)交互 。
簡單來說,CORS就是服務(wù)器在HTTP響應(yīng)頭中告訴瀏覽器:“我信任這個(gè)來源的請(qǐng)求,放行吧。”
1.4 兩種跨域請(qǐng)求類型
瀏覽器將CORS請(qǐng)求分為兩類,處理方式有所不同:
| 請(qǐng)求類型 | 滿足條件 | 處理特點(diǎn) |
|---|---|---|
| 簡單請(qǐng)求 | 方法為GET、HEAD、POST;Content-Type僅限于application/x-www-form-urlencoded、multipart/form-data、text/plain | 瀏覽器直接發(fā)出請(qǐng)求,在請(qǐng)求頭中附加Origin字段,服務(wù)器返回的響應(yīng)頭必須包含Access-Control-Allow-Origin |
| 預(yù)檢請(qǐng)求 | 不滿足簡單請(qǐng)求條件的請(qǐng)求(如PUT、DELETE方法,或Content-Type為application/json) | 瀏覽器先發(fā)送OPTIONS請(qǐng)求詢問服務(wù)器是否允許實(shí)際請(qǐng)求,得到肯定答復(fù)后才發(fā)送真實(shí)請(qǐng)求 |
理解這兩種請(qǐng)求類型的區(qū)別非常重要,因?yàn)樵趯?shí)際開發(fā)中,我們最常用的Content-Type就是application/json,這恰恰屬于需要預(yù)檢請(qǐng)求的情況。
第二章:Python后端CORS配置全攻略
2.1 Django框架的CORS配置
Django作為Python最流行的Web框架,處理跨域問題通常借助于第三方庫django-cors-headers。
2.1.1 安裝與基礎(chǔ)配置
pip install django-cors-headers
安裝完成后,需要在Django項(xiàng)目的settings.py中進(jìn)行配置 :
# settings.py
# 注冊(cè)應(yīng)用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
# ... 其他應(yīng)用
'corsheaders', # 添加corsheaders
]
# 添加中間件(注意位置要盡量靠前)
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 應(yīng)該放在最前面
'django.middleware.common.CommonMiddleware',
# ... 其他中間件
]
2.1.2 允許所有來源(開發(fā)環(huán)境專用)
在開發(fā)環(huán)境中,為了快速調(diào)試,可以暫時(shí)允許所有來源訪問 :
# settings.py # 允許所有來源(生產(chǎn)環(huán)境切勿使用!) CORS_ALLOW_ALL_ORIGINS = True # Django 3.x及以上版本 # 對(duì)于舊版本Django,使用 CORS_ORIGIN_ALLOW_ALL = True
2.1.3 指定允許的來源(生產(chǎn)環(huán)境推薦)
生產(chǎn)環(huán)境中,應(yīng)當(dāng)嚴(yán)格指定允許訪問的域名 :
# settings.py
# 只允許特定域名訪問
CORS_ALLOWED_ORIGINS = [
"https://example.com",
"https://sub.example.com",
"http://localhost:5173", # Vue開發(fā)服務(wù)器
"http://127.0.0.1:5173",
"http://localhost:8080", # 備用端口
]
# 如果需要支持正則表達(dá)式匹配(如動(dòng)態(tài)子域名)
CORS_ALLOWED_ORIGIN_REGEXES = [
r"^https://\w+\.example\.com$",
]
2.1.4 高級(jí)配置選項(xiàng)
# settings.py
# 允許攜帶Cookie(跨域請(qǐng)求中攜帶身份憑證)
CORS_ALLOW_CREDENTIALS = True # 默認(rèn)為False
# 允許的HTTP請(qǐng)求方法
CORS_ALLOW_METHODS = (
"DELETE",
"GET",
"OPTIONS",
"PATCH",
"POST",
"PUT",
)
# 允許的非標(biāo)準(zhǔn)HTTP請(qǐng)求頭
CORS_ALLOW_HEADERS = (
"accept",
"authorization",
"content-type",
"user-agent",
"x-csrftoken",
"x-requested-with",
# 可以添加自定義頭
"my-custom-header",
)
# 預(yù)檢請(qǐng)求的有效期(秒),減少預(yù)檢請(qǐng)求次數(shù)
CORS_PREFLIGHT_MAX_AGE = 86400 # 24小時(shí)
# 限制CORS頭生效的URL
CORS_URLS_REGEX = r"^/api/.*$" # 只對(duì)/api/路徑應(yīng)用CORS
2.1.5 Django + Vue部署時(shí)的CSRF問題
在Django+Vue的前后端分離項(xiàng)目中,啟用CORS后還需要注意CSRF保護(hù)的配置 :
# settings.py
# 允許跨域攜帶Cookie
CORS_ALLOW_CREDENTIALS = True
# 信任的來源(用于CSRF保護(hù))
CSRF_TRUSTED_ORIGINS = [
"http://localhost:5173",
"https://yourdomain.com",
]
2.2 Flask框架的CORS配置
Flask作為輕量級(jí)Web框架,可以通過flask-cors擴(kuò)展輕松實(shí)現(xiàn)CORS支持。
2.2.1 安裝與初始化
pip install flask-cors
2.2.2 全局CORS配置
最簡單的配置方式是全局啟用CORS :
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app) # 允許所有來源訪問所有路由
@app.route('/api/data')
def get_data():
return {'message': 'Hello CORS!'}
2.2.3 精細(xì)化配置
如果需要更精細(xì)的控制,可以傳入配置參數(shù) :
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
# 配置CORS選項(xiàng)
cors = CORS(app, resources={
r"/api/*": { # 只對(duì)/api路徑生效
"origins": ["http://localhost:5173", "https://example.com"],
"methods": ["GET", "POST", "PUT", "DELETE"],
"allow_headers": ["Content-Type", "Authorization"],
"supports_credentials": True, # 允許攜帶Cookie
"max_age": 3600 # 預(yù)檢請(qǐng)求緩存時(shí)間
},
r"/public/*": {
"origins": "*", # 公開接口允許所有來源
"methods": ["GET"]
}
})
@app.route('/api/data')
def get_data():
return {'message': 'Hello CORS!'}
@app.route('/public/info')
def public_info():
return {'message': 'This is public'}
2.2.4 使用裝飾器進(jìn)行單接口配置
如果只需要個(gè)別接口支持跨域,可以使用@cross_origin裝飾器 :
from flask import Flask, jsonify
from flask_cors import cross_origin
app = Flask(__name__)
@app.route('/api/hello')
@cross_origin(origins='http://localhost:5173')
def hello():
return jsonify({'message': 'Hello World'})
@app.route('/api/goodbye')
# 不添加裝飾器,不支持跨域
def goodbye():
return jsonify({'message': 'Goodbye World'})
2.3 FastAPI框架的CORS配置
FastAPI作為新興的異步框架,內(nèi)置了CORS中間件,配置起來也非常簡單。
2.3.1 安裝FastAPI和Uvicorn
pip install fastapi uvicorn
2.3.2 配置CORS中間件
FastAPI通過CORSMiddleware來處理跨域 :
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# 配置CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:5173", "https://example.com"], # 允許的來源
allow_credentials=True, # 允許攜帶Cookie
allow_methods=["*"], # 允許所有方法
allow_headers=["*"], # 允許所有請(qǐng)求頭
max_age=3600, # 預(yù)檢請(qǐng)求緩存時(shí)間
)
@app.get("/api/data")
async def read_data():
return {"message": "Hello from FastAPI"}
2.3.3 動(dòng)態(tài)來源配置
如果來源列表需要?jiǎng)討B(tài)生成,可以使用回調(diào)函數(shù):
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from typing import List
app = FastAPI()
# 從環(huán)境變量或數(shù)據(jù)庫加載允許的來源
def get_allowed_origins() -> List[str]:
# 這里可以從數(shù)據(jù)庫讀取配置
return ["http://localhost:5173", "https://yourdomain.com"]
origins = get_allowed_origins()
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["GET", "POST", "PUT", "DELETE"],
allow_headers=["Content-Type", "Authorization"],
)
2.4 三種Python框架CORS配置對(duì)比
| 特性 | Django | Flask | FastAPI |
|---|---|---|---|
| 主要庫 | django-cors-headers | flask-cors | CORSMiddleware(內(nèi)置) |
| 全局配置 | settings.py中配置 | CORS(app) | app.add_middleware |
| 細(xì)粒度控制 | CORS_URLS_REGEX | resources參數(shù) | 路徑依賴配置 |
| 攜帶Cookie | CORS_ALLOW_CREDENTIALS | supports_credentials | allow_credentials |
| 預(yù)檢緩存 | CORS_PREFLIGHT_MAX_AGE | max_age | max_age |
第三章:前端開發(fā)環(huán)境代理解決方案
在開發(fā)環(huán)境中,除了后端配置CORS外,前端也可以通過代理服務(wù)器來規(guī)避跨域問題。這種方法的好處是不需要修改后端代碼,特別適合在聯(lián)調(diào)階段使用。
3.1 Vite項(xiàng)目的代理配置
Vue 3項(xiàng)目通常使用Vite作為構(gòu)建工具,可以通過配置vite.config.js實(shí)現(xiàn)代理 :
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
server: {
proxy: {
// 將以/api開頭的請(qǐng)求代理到后端服務(wù)器
'/api': {
target: 'http://localhost:8000', // 后端服務(wù)器地址
changeOrigin: true, // 改變請(qǐng)求頭中的Origin為目標(biāo)地址
rewrite: (path) => path.replace(/^\/api/, ''), // 可選:重寫路徑
configure: (proxy, options) => {
// 代理配置的回調(diào),可以添加日志等
proxy.on('error', (err, req, res) => {
console.log('proxy error', err);
});
}
},
// 多個(gè)代理規(guī)則
'/uploads': {
target: 'http://localhost:8000',
changeOrigin: true,
}
}
}
})理解rewrite的作用:如果后端接口實(shí)際路徑是http://localhost:8000/hello,而前端希望用/api/hello調(diào)用,就需要rewrite去掉/api前綴;如果后端接口本身就帶有/api前綴(如http://localhost:8000/api/hello),則不需要rewrite 。
3.2 Axios請(qǐng)求封裝
結(jié)合代理配置,Axios的請(qǐng)求可以這樣封裝 :
// src/utils/request.js
import axios from 'axios'
const request = axios.create({
baseURL: '', // 由于代理配置,可以留空或?qū)?/'
timeout: 10000,
withCredentials: true, // 允許攜帶Cookie(如果需要)
})
// 請(qǐng)求攔截器
request.interceptors.request.use(
config => {
// 添加token等認(rèn)證信息
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
error => {
return Promise.reject(error)
}
)
// 響應(yīng)攔截器
request.interceptors.response.use(
response => {
return response.data
},
error => {
// 統(tǒng)一錯(cuò)誤處理
console.error('請(qǐng)求錯(cuò)誤:', error)
return Promise.reject(error)
}
)
export default request3.3 在Vue組件中使用
// views/Example.vue
import request from '@/utils/request'
export default {
methods: {
async fetchData() {
try {
// 實(shí)際請(qǐng)求會(huì)被代理到 http://localhost:8000/hello
const data = await request.get('/api/hello')
console.log(data)
} catch (error) {
console.error('數(shù)據(jù)獲取失敗', error)
}
}
}
}3.4 開發(fā)代理vs生產(chǎn)CORS
需要明確的是,前端代理方案僅適用于開發(fā)環(huán)境。當(dāng)項(xiàng)目構(gòu)建并部署到生產(chǎn)環(huán)境時(shí),代理配置不會(huì)生效。生產(chǎn)環(huán)境仍然需要后端正確配置CORS,或者通過Nginx等反向代理解決跨域 。
| 方案 | 適用環(huán)境 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|---|
| Vite代理 | 開發(fā)環(huán)境 | 配置簡單,無需修改后端 | 僅開發(fā)環(huán)境有效 |
| 后端CORS | 生產(chǎn)環(huán)境 | 標(biāo)準(zhǔn)化解決方案,安全可控 | 需要后端配合 |
| Nginx代理 | 生產(chǎn)環(huán)境 | 無需修改應(yīng)用代碼,統(tǒng)一入口 | 需要運(yùn)維知識(shí) |
第四章:生產(chǎn)環(huán)境部署與Nginx配置
在生產(chǎn)環(huán)境中,除了后端配置CORS外,還可以使用Nginx作為反向代理來解決跨域問題。這種方式可以實(shí)現(xiàn)前后端同源訪問,徹底規(guī)避跨域。
4.1 同源部署策略
最簡單的方式是將前端靜態(tài)文件和后端API部署在同一個(gè)域名的不同路徑下 :
https://example.com/ # 前端頁面
https://example.com/api/ # 后端API
這種部署方式不存在跨域問題,但要求前端路由不能與API路徑?jīng)_突。
4.2 Nginx反向代理配置
如果前端和后端部署在不同服務(wù)器上,可以通過Nginx反向代理將API請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)器 :
# /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com;
# 前端靜態(tài)文件
location / {
root /var/www/frontend/dist;
try_files $uri $uri/ /index.html;
}
# API代理
location /api/ {
proxy_pass http://backend-server:8000/; # 后端服務(wù)器地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 如果是跨域場(chǎng)景,可以在這里添加CORS頭
add_header Access-Control-Allow-Origin $http_origin always;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
add_header Access-Control-Allow-Credentials "true" always;
# 處理預(yù)檢請(qǐng)求
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin $http_origin always;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
add_header Access-Control-Allow-Credentials "true" always;
add_header Content-Length 0;
add_header Content-Type text/plain;
return 204;
}
}
}4.3 Docker Compose多服務(wù)部署
對(duì)于使用Docker部署的項(xiàng)目,可以通過docker-compose配置多個(gè)服務(wù) :
# docker-compose.yml
version: '3.8'
services:
backend:
build: ./backend
container_name: django_backend
expose:
- "8000"
environment:
- DEBUG=False
- CORS_ALLOWED_ORIGINS=http://localhost,https://example.com
networks:
- app_network
frontend:
build: ./frontend
container_name: vue_frontend
ports:
- "80:80"
depends_on:
- backend
networks:
- app_network
nginx:
image: nginx:latest
container_name: nginx_proxy
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
ports:
- "80:80"
- "443:443"
depends_on:
- backend
- frontend
networks:
- app_network
networks:
app_network:
driver: bridge第五章:跨域疑難問題排查指南
5.1 常見跨域錯(cuò)誤信息及解讀
| 錯(cuò)誤信息 | 可能原因 | 解決方案 |
|---|---|---|
| No 'Access-Control-Allow-Origin' header is present | 后端未配置CORS或配置不正確 | 檢查后端CORS配置,確保返回了正確的響應(yīng)頭 |
| Response to preflight request doesn't pass access control check | 預(yù)檢請(qǐng)求未通過 | 確保OPTIONS請(qǐng)求正確處理,返回了204狀態(tài)碼和允許頭 |
| Credentials flag is 'true', but the 'Access-Control-Allow-Origin' header is '*' | 攜帶憑證時(shí)不能使用通配符 * | 將Access-Control-Allow-Origin設(shè)置為具體域名 |
| Multiple CORS header 'Access-Control-Allow-Origin' not allowed | 響應(yīng)頭重復(fù)設(shè)置 | 檢查是否有多個(gè)地方同時(shí)設(shè)置CORS頭 |
5.2 排查清單
當(dāng)遇到跨域問題時(shí),可以按照以下清單逐一排查 :
確認(rèn)請(qǐng)求URL正確性
- 協(xié)議、域名、端口是否匹配預(yù)期?
- 路徑是否正確?
檢查CORS響應(yīng)頭
Access-Control-Allow-Origin是否存在且正確?Access-Control-Allow-Credentials是否設(shè)置為true(如果需要攜帶Cookie)?Access-Control-Allow-Methods是否包含實(shí)際請(qǐng)求方法?
驗(yàn)證預(yù)檢請(qǐng)求
- OPTIONS請(qǐng)求是否返回200或204狀態(tài)碼?
- 響應(yīng)頭是否完整?
檢查憑證配置
- 前端是否設(shè)置
withCredentials: true或credentials: 'include'? - 后端是否設(shè)置
Access-Control-Allow-Credentials: true? - 是否同時(shí)使用通配符
*和true?(不允許)
驗(yàn)證代理配置(開發(fā)環(huán)境)
- 代理規(guī)則是否正確?
- 路徑重寫是否生效?
- 請(qǐng)求頭是否正確傳遞?
5.3 調(diào)試工具推薦
- 瀏覽器開發(fā)者工具:查看Network面板中的請(qǐng)求和響應(yīng)頭
- Postman/Insomnia:繞過瀏覽器限制測(cè)試API
- curl命令:快速測(cè)試CORS頭
# 測(cè)試OPTIONS預(yù)檢請(qǐng)求 curl -X OPTIONS http://localhost:8000/api/data \ -H "Origin: http://localhost:5173" \ -H "Access-Control-Request-Method: GET" \ -v # 測(cè)試實(shí)際請(qǐng)求 curl -X GET http://localhost:8000/api/data \ -H "Origin: http://localhost:5173" \ -v
第六章:安全最佳實(shí)踐
6.1 切勿在生產(chǎn)環(huán)境使用通配符
將Access-Control-Allow-Origin設(shè)置為*雖然方便,但會(huì)允許任何網(wǎng)站訪問你的API,存在嚴(yán)重安全風(fēng)險(xiǎn)。生產(chǎn)環(huán)境必須明確指定允許的來源列表 。
6.2 謹(jǐn)慎處理Cookie憑證
當(dāng)設(shè)置allowCredentials(true)時(shí),必須注意 :
Access-Control-Allow-Origin不能為*Access-Control-Allow-Headers不能為*- Cookie的SameSite屬性可能需要設(shè)置為
None(HTTPS環(huán)境下)
6.3 合理設(shè)置預(yù)檢請(qǐng)求緩存
通過maxAge設(shè)置適當(dāng)?shù)念A(yù)檢請(qǐng)求緩存時(shí)間,可以減少不必要的OPTIONS請(qǐng)求,提升性能。一般建議設(shè)置為600到86400秒之間 。
6.4 遵循最小權(quán)限原則
只開放必要的HTTP方法和請(qǐng)求頭,不要盲目使用*。例如,如果API只支持GET請(qǐng)求,就應(yīng)該限制Access-Control-Allow-Methods為GET 。
6.5 與CSRF防護(hù)協(xié)同工作
啟用CORS允許跨域攜帶Cookie時(shí),需要特別注意CSRF攻擊防護(hù)。Django等框架提供了CSRF_TOKEN機(jī)制,需要將前端域名添加到CSRF信任列表中 。
結(jié)語
跨域問題是前后端分離架構(gòu)中的一道必經(jīng)關(guān)卡,理解其原理并掌握解決方案是每個(gè)Web開發(fā)者的基本功。通過本文的學(xué)習(xí),你應(yīng)該已經(jīng)掌握了:
- 跨域問題的本質(zhì):瀏覽器的同源安全策略
- CORS的核心機(jī)制:簡單請(qǐng)求與預(yù)檢請(qǐng)求
- Python三大框架的CORS配置方法
- 開發(fā)環(huán)境的代理解決方案
- 生產(chǎn)環(huán)境的Nginx部署策略
- 安全最佳實(shí)踐和問題排查技巧
記住,跨域不是Bug,而是瀏覽器保護(hù)用戶的安全機(jī)制。選擇合適的方案、遵循安全規(guī)范,就能在保證安全的前提下實(shí)現(xiàn)跨域資源共享。希望本文能幫助你在實(shí)際項(xiàng)目中游刃有余地應(yīng)對(duì)跨域挑戰(zhàn)!
以上就是一文帶你徹底掌握Python前后端跨域問題的解決方法的詳細(xì)內(nèi)容,更多關(guān)于Python跨域問題解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python代碼打包為EXE的完全指南(圖文詳解+問題排查)
在 Python 開發(fā)完成后,為了方便非技術(shù)用戶使用,將代碼打包為 EXE 可執(zhí)行文件是常用需求,下面小編就和大家詳細(xì)講講使用 PyInstaller 工具打包的完整流程吧2025-11-11
Pandas-DataFrame知識(shí)點(diǎn)匯總
這篇文章主要介紹了Pandas-DataFrame知識(shí)點(diǎn)匯總,DataFrame是一種表格型數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值,下面我們一起進(jìn)入文章了解更多詳細(xì)內(nèi)容吧,需要的小伙伴也可以參考一下2022-03-03
Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的代碼(JSON模塊)
這篇文章主要介紹了Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的代碼(JSON模塊),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Python進(jìn)行Restful?API開發(fā)實(shí)例詳解
這篇文章主要介紹了Python進(jìn)行Restful?API開發(fā)實(shí)例,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
python爬蟲框架scrapy實(shí)戰(zhàn)之爬取京東商城進(jìn)階篇
這篇文章主要給大家介紹了利用python爬蟲框架scrapy爬取京東商城的相關(guān)資料,文中給出了詳細(xì)的代碼介紹供大家參考學(xué)習(xí),并在文末給出了完整的代碼,需要的朋友們可以參考學(xué)習(xí),下面來一起看看吧。2017-04-04
Python?Pandas中數(shù)據(jù)類型查看與轉(zhuǎn)換方法
Pandas提供了豐富的數(shù)據(jù)類型系統(tǒng)以及靈活的類型轉(zhuǎn)換方法,下面小編就來詳細(xì)介紹一下如何查看Pandas數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)類型和進(jìn)行有效的類型轉(zhuǎn)換吧2025-04-04
淺談django開發(fā)者模式中的autoreload是如何實(shí)現(xiàn)的
下面小編就為大家?guī)硪黄獪\談django開發(fā)者模式中的autoreload是如何實(shí)現(xiàn)的。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
詳解Python中os.path與pathlib的用法和性能對(duì)比
pathlib 模塊是在Python3.4版本中首次被引入到標(biāo)準(zhǔn)庫中的,這篇文章主要來和大家介紹一下Python中os.path與pathlib再用法和性能上的區(qū)別,感興趣的可以了解下2024-03-03

