在 Windows 下搭建高效的 django 開(kāi)發(fā)環(huán)境的詳細(xì)教程
從初學(xué) django 到現(xiàn)在(記得那時(shí)最新版本是 1.8,本文發(fā)布時(shí)已經(jīng)發(fā)展到 3.1 了),開(kāi)發(fā)環(huán)境一直都是使用從官方文檔或者別的教程中學(xué)來(lái)的方式搭建的。但是在實(shí)際項(xiàng)目的開(kāi)發(fā)中,越來(lái)越感覺(jué)之前的開(kāi)發(fā)環(huán)境難以適應(yīng)項(xiàng)目的發(fā)展。官方文檔或一些教程中的環(huán)境搭建方式主要存在這些問(wèn)題:
python manage.py runserver
啟動(dòng)的開(kāi)發(fā)服務(wù)器熱重載非常慢,尤其是當(dāng)項(xiàng)目中導(dǎo)入了大量模塊時(shí),有時(shí)候改一次代碼要等幾秒鐘才能完成重載。 主力開(kāi)發(fā)環(huán)境為 Windows + PyCharm,然而有時(shí)候依賴(lài)的一些服務(wù)只能在 Linux 下運(yùn)行(例如 Celery 以及其他一些異步任務(wù)的庫(kù)如 django-q )。
針對(duì)以上的一些痛點(diǎn),我在實(shí)際開(kāi)發(fā)當(dāng)中逐步摸索出一套新的開(kāi)發(fā)環(huán)境搭建方法,用來(lái)搭建一套舒適的 django 開(kāi)發(fā)環(huán)境,總的來(lái)說(shuō),新的環(huán)境包括以下幾個(gè)方面的改進(jìn):
- 使用 Uvicorn 代替 django 自帶的開(kāi)發(fā)服務(wù)器啟動(dòng)應(yīng)用,極大提高代碼熱重載速度。
- 使用 Pipenv 或者 Poetry 來(lái)管理虛擬環(huán)境和項(xiàng)目依賴(lài)。
- 使用 Docker 容器來(lái)運(yùn)行需要在 Linux 平臺(tái)下才能運(yùn)行的服務(wù)。
- 使用 AutoHotkey 為常用命令設(shè)置 alias。
PyCharm 創(chuàng)建 django 項(xiàng)目
Django 項(xiàng)目開(kāi)發(fā)首選 PyCharm,當(dāng)然你也可以使用 VS Code,不過(guò)極有可能隨著一通折騰和配置之后,你會(huì)發(fā)現(xiàn)終于成功地把 VS Code 配置成了一個(gè) PyCharm。所以為了節(jié)約有限的開(kāi)發(fā)時(shí)間以及生命,推薦直接使用 PyCharm。
PyCharm 創(chuàng)建一個(gè) django 項(xiàng)目非常簡(jiǎn)單,如果是第一次打開(kāi) PyCharm,點(diǎn)擊 + Create New Project 就會(huì)彈出創(chuàng)建新項(xiàng)目的對(duì)話(huà)框。如果已經(jīng)打開(kāi)過(guò)別的項(xiàng)目,則依次點(diǎn)擊頂部導(dǎo)航條的 File > New Project 也會(huì)彈出創(chuàng)建新項(xiàng)目的對(duì)話(huà)框。
然后在對(duì)話(huà)框左側(cè)點(diǎn)擊 django ,就會(huì)進(jìn)入 django 項(xiàng)目的配置頁(yè)面,完成一些初始化設(shè)置,PyCharm 就會(huì)自動(dòng)為我們創(chuàng)建一個(gè)新的 django 項(xiàng)目。
Django 項(xiàng)目的配置頁(yè)面如圖:
Location配置項(xiàng)會(huì)讓你選擇項(xiàng)目位置,例如我要在 C:\Users\user\SpaceLocal\Workspace\G_Courses\
目錄下創(chuàng)建一個(gè)名為 django_dev_env_demo
的項(xiàng)目,就填寫(xiě) C:\Users\user\SpaceLocal\Workspace\G_Courses\django-dev-env-demo
。
然后 Project Interpret 選項(xiàng)的展開(kāi)項(xiàng)中有 2 個(gè)選項(xiàng)
- New environment using
勾選這個(gè)選項(xiàng)將使用你選擇的虛擬環(huán)境創(chuàng)建工具為新建的項(xiàng)目創(chuàng)建一個(gè) Python 虛擬環(huán)境。PyCharm 支持多種虛擬環(huán)境創(chuàng)建工具,默認(rèn)為自帶的 Virtualenv。我之前習(xí)慣使用 Pipenv,只需要在系統(tǒng)全局使用 pip install pipenv
后,PyCharm 就會(huì)自動(dòng)發(fā)現(xiàn) Pipenv 的存在。不過(guò)現(xiàn)在我更加傾向于使用 Poetry,PyCharm 目前還沒(méi)有集成 Poetry,但是可以在創(chuàng)建完項(xiàng)目后手動(dòng)設(shè)置 Poetry,配置也是超級(jí)簡(jiǎn)單,將在后面介紹。
創(chuàng)建新的虛擬環(huán)境需要指定一個(gè) Base interpreter 基礎(chǔ) Python 環(huán)境,通常 PyCharm 會(huì)自動(dòng)發(fā)現(xiàn)系統(tǒng)當(dāng)前正在使用的 Python 解釋器,如果 PyCharm 沒(méi)有自動(dòng)發(fā)現(xiàn)或者想要更換為系統(tǒng)中其它的 Python 解釋器版本,也可以在 Base interpreter 選項(xiàng)里手動(dòng)選擇 Python 解釋器。
使用 Pipenv 創(chuàng)建虛擬環(huán)境時(shí),PyCharm 同樣會(huì)自動(dòng)發(fā)現(xiàn)系統(tǒng)中安裝的 Pipenv 工具,如果沒(méi)有發(fā)現(xiàn),也可以在選項(xiàng)中手動(dòng)選擇。
- Existing interpreter
勾選這個(gè)選項(xiàng)將使用系統(tǒng)已有的 Python 環(huán)境。
More Settings選項(xiàng)的展開(kāi)項(xiàng)中包含更多的 django 初始化設(shè)置:
- Template language
使用的模板引擎,如果沒(méi)有特別理由,當(dāng)然是選擇 django 自帶的模板引擎,當(dāng)然不嫌麻煩也可以選擇 jinja2。
- Template folder
存放模板的文件夾名稱(chēng)。默認(rèn)即可,后續(xù)可以在項(xiàng)目中更改。
- Application name
django app 名稱(chēng),填不填都行,后續(xù)可以使用 python manage.py startapp
命令來(lái)創(chuàng)建 django app。
勾選 Enable Django admin 將啟用 django 自帶的 admin 管理后臺(tái)。
配置完成后,點(diǎn)擊 Create 就可以創(chuàng)建一個(gè)全新的 django 項(xiàng)目了。
Uvicorn 運(yùn)行 django
之前說(shuō)過(guò),django 內(nèi)置的開(kāi)發(fā)服務(wù)器在修改代碼后的熱重載非常緩慢,我發(fā)現(xiàn) uvicorn 的重載速度要快得多,所以新項(xiàng)目第一件事,就是使用在開(kāi)發(fā)環(huán)境下使用 uvicorn 運(yùn)行 django。
首先當(dāng)然要安裝 uvicorn。
安裝 uvicorn 非常簡(jiǎn)單,首先打開(kāi) PyCharm 的 Terminal,PyCharm 會(huì)自動(dòng)幫我們激活項(xiàng)目關(guān)聯(lián)的虛擬環(huán)境,所有命令將在虛擬環(huán)境執(zhí)行,非常方便。執(zhí)行 pipenv install uvicorn
安裝 uvicorn 就可以了。
Uvicorn 安裝好后,可以在命令行使用 uvicorn 命令來(lái)運(yùn)行 django。但是,每次輸命令啟動(dòng) django 會(huì)非常麻煩!最好的做法是創(chuàng)建一個(gè)腳本,啟動(dòng) django 只需要執(zhí)行腳本就可以了。
在 項(xiàng)目根目錄 創(chuàng)建一個(gè) run_uvicorn.py 的腳本(腳本名可以自己隨便取),代碼如下:
run_uvicorn.py
import uvicorn import os def main(): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_dev_env_demo.settings") uvicorn.run( "django_dev_env_demo.asgi:application", host="0.0.0.0", port=8000, log_level="debug", reload=True, ) if __name__ == "__main__": main()
腳本中可以隨意定制代碼的邏輯,非常靈活。比如這里我首先設(shè)置了一個(gè)環(huán)境變量 DJANGO_SETTINGS_MODULE
用來(lái)指定 django 啟動(dòng)時(shí)加載的配置文件。舉一反三,可以在 uvicorn.run
之前進(jìn)行更多的設(shè)置。例如對(duì)于更加復(fù)雜的項(xiàng)目,我通常會(huì)把一些重要的路徑加入到 sys.path
中,以及設(shè)置項(xiàng)目所需的環(huán)境變量。
然后就是 uvicorn.run
啟動(dòng) django。更確切點(diǎn)地說(shuō)就是啟動(dòng)一個(gè) ASGI 或者 WSGI 應(yīng)用。django 3 以后逐漸支持 ASGI 應(yīng)用,而在此之前則是 WSGI。第一個(gè)參數(shù)傳入 ASGI 或者 WSGI 應(yīng)用所在的模塊。例如這里的 django_dev_env_demo.asgi:application
表示 django_dev_env_demo 下 asgi.py 模塊里的 application(django 提供的 ASGI 應(yīng)用的實(shí)例),在 django_dev_env_demo/asgi.py 下可以看到。如果是 django 3.0 以前版本,相應(yīng)改為 WSGI application 所在模塊即可。
其它啟動(dòng)參數(shù)顧名思義,最為重要的就是這個(gè) reload
,它啟動(dòng)熱重載功能,比 django 自帶的開(kāi)發(fā)服務(wù)器重載快 很多。
PyCharm 執(zhí)行一個(gè) Python 腳本非常方便,點(diǎn)擊 if __name__=="__main__"
旁邊的綠色小三角就可以執(zhí)行這個(gè)腳本,或者鼠標(biāo)放到 run_uvicorn.py 上,然后點(diǎn)擊鼠標(biāo)右鍵,再點(diǎn)擊 Run ‘run_uvicorn'。點(diǎn)擊 Debug ‘run_uvicorn',則以 debug 模式啟動(dòng) django,開(kāi)發(fā)過(guò)程中可以非常方便地打斷點(diǎn)進(jìn)行調(diào)試。
腳本運(yùn)行后的輸出:
說(shuō)明應(yīng)用已在 8000 端口啟動(dòng),現(xiàn)在訪(fǎng)問(wèn) localhost:8000,可以看到熟悉的 django 項(xiàng)目初始頁(yè)面。
對(duì)于運(yùn)行過(guò)的腳本,PyCharm 都會(huì)記錄在右上角,以后只要在右上角的下拉框中選擇需要執(zhí)行的腳本,然后點(diǎn)擊綠色三角或者 debug 按鈕執(zhí)行就可以了,非常方便!
Docker 運(yùn)行外部服務(wù)
以前為了開(kāi)發(fā) django,我需要在系統(tǒng)中安裝和配置各種服務(wù),例如 MySQL、PostgreSQL、Redis、Elasticsearch,有些服務(wù) Windows 還配不了,比如 Celery。
現(xiàn)在有了 Docker 容器,一切變得簡(jiǎn)單。
例如我需要一個(gè) PostgreSQL,我只需要一條命令就可以啟動(dòng)一個(gè) PostgreSQL 容器。當(dāng)然更好的做法是編寫(xiě)一個(gè) docker-compose 文件,并且設(shè)置該容器隨 Docker 啟動(dòng)而啟動(dòng),我系統(tǒng)中 PostgreSQL 服務(wù)的 Dockerfile 和docker-compose.yml 文件如下:
Dockerfile
FROM postgres:11.3
docker-compose.yml
version: '3' volumes: postgres_data: {} postgres_data_backups: {} services: postgres: restart: always build: context: . image: postgres container_name: postgres volumes: - postgres_data:/var/lib/postgresql/data - postgres_data_backups:/backups env_file: - postgres.env ports: - "14789:5432"
各項(xiàng)配置的含義請(qǐng)參考 Docker 的官方文檔,實(shí)現(xiàn)的效果就是系統(tǒng)開(kāi)機(jī)自啟動(dòng) Docker,Docker 啟動(dòng)后自動(dòng)啟動(dòng)一個(gè)運(yùn)行著 PostgreSQL 數(shù)據(jù)庫(kù)服務(wù)的容器,服務(wù)映射到主機(jī)的 14789 端口,這樣,我的 django 或者其他應(yīng)用程序都可以通過(guò) host.docker.internal:14789 訪(fǎng)問(wèn)到 PostgreSQL 數(shù)據(jù)庫(kù)服務(wù)。
最棒的是,PyCharm 還集成了數(shù)據(jù)庫(kù)管理工具,無(wú)論是 SQLite 還是 MySQL 或者 PostgreSQL,都可以輕松連接,這樣開(kāi)發(fā)過(guò)程中就不需要使用額外的數(shù)據(jù)庫(kù)可視化工具來(lái)查看開(kāi)發(fā)數(shù)據(jù)了。
以 SQLite 為例,示例項(xiàng)目中運(yùn)行 python manage.py migrate 命令創(chuàng)建數(shù)據(jù)庫(kù)。
對(duì)于 SQLite 數(shù)據(jù)庫(kù),只需要雙擊數(shù)據(jù)庫(kù)文件就可以直接連接,然后就能查看數(shù)據(jù)庫(kù)表結(jié)構(gòu)以及表中的數(shù)據(jù)了:
其它如 MySQL、PostgreSQL,只需要手動(dòng)添加 Data Source 就可以連接。
類(lèi)似的,Redis 現(xiàn)在幾乎是開(kāi)發(fā)必備,我會(huì)設(shè)置系統(tǒng)啟動(dòng)后也會(huì)自動(dòng)啟動(dòng)一個(gè) 運(yùn)行著 Redis 服務(wù)的容器。docker-compose.yml 文件內(nèi)容如下:
version: '3' services: redis: restart: always image: 'bitnami/redis:5.0' container_name: redis ports: - '48988:6379' volumes: - 'redis_data:/bitnami/redis/data' env_file: - redis.env volumes: redis_data: driver: local
服務(wù)映射到主機(jī)的 48988 端口,這樣,我的 django 或者其他應(yīng)用程序都可以通過(guò) host.docker.internal:48988 訪(fǎng)問(wèn)到 redis 服務(wù)。
其它任何服務(wù)都可以類(lèi)似地配置,例如 Elasticsearch、Celery 等等。
AutoHotkey
開(kāi)發(fā)過(guò)程中難免需要輸入大量命令,比如 django 中的這幾條使用頻率極高:
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser
重復(fù)輸入這些命令單調(diào)又枯燥,還浪費(fèi)生命。
AutoHotkey 的其中一個(gè)功能是為指定的文本設(shè)置縮寫(xiě)詞,并使用熱鍵將縮寫(xiě)詞展開(kāi)為全文本。例如我會(huì)為以上命令設(shè)置縮寫(xiě)詞:
python manage.py makemigrations 設(shè)置為 pmmm,按 tab 鍵展開(kāi) python manage.py migrate 設(shè)置為 pmm,按 tab 鍵展開(kāi) python manage.py createsuperuser 設(shè)置為 pmcs,按 tab 鍵展開(kāi)
我只需要在命令行輸入 pmmm 再按 tab,AutoHotkey 就會(huì)將其展開(kāi)為 python manage.py makemigrations
的完整命令。
當(dāng)然,AutoHotkey 的功能遠(yuǎn)不止如此,還可以用來(lái)設(shè)置快捷打開(kāi)常用網(wǎng)站,常用文件夾等等,現(xiàn)在已是我在 Windows 下節(jié)約不少生命值的效率工具。
使用 Poetry?
Poetry 與 Pipenv 的爭(zhēng)議
當(dāng)年關(guān)于 Pipenv 還是 Poetry 曾引發(fā)過(guò)不少爭(zhēng)議?!禙lask Web 開(kāi)發(fā)實(shí)戰(zhàn)》的作者發(fā)文呼吁大家 不要用 Pipenv ,并列舉了不少 Pipenv 存在的問(wèn)題。
Pipenv 的確存在不少如文中所說(shuō)的問(wèn)題,很多問(wèn)題 issue 維護(hù)者給出的建議是請(qǐng)安裝 master 分支的代碼。
在體驗(yàn)了 Poetry 以后,我發(fā)現(xiàn)遷移 Poetry 并非一件困難的事,而且對(duì)于日常使用來(lái)說(shuō),Poetry 一樣簡(jiǎn)單易用,所以目前對(duì)于新的項(xiàng)目,我都會(huì)優(yōu)先使用 Poetry。
當(dāng)然話(huà)說(shuō)回來(lái),Pipenv 的一些問(wèn)題都是一些特殊環(huán)境下的問(wèn)題,這些問(wèn)題 Poetry 同樣也會(huì)存在。對(duì)于一般的使用場(chǎng)景,我并未發(fā)現(xiàn) Pipenv 和 Poetry 的使用區(qū)別。
所以總結(jié)一句話(huà),我的使用原則是:
優(yōu)先用 Poetry,但對(duì)于一些小項(xiàng)目或者示例項(xiàng)目,為了更好地和 PyCharm 配合,我也會(huì)使用 Pipenv。
PyCharm 中設(shè)置 Poetry
PyCharm 中設(shè)置 Poetry 非常簡(jiǎn)單。當(dāng)然首先第一步是安裝 Poetry,安裝也是超級(jí)簡(jiǎn)單,各種操作系統(tǒng)平臺(tái)都是一條命令搞定,安裝命令可參考 Poetry 的 官方文檔 。
Poetry 安裝后,在項(xiàng)目根目錄執(zhí)行 poetry init
命令初始化項(xiàng)目,依據(jù)提示輸入初始化設(shè)置后,poetry 會(huì)在項(xiàng)目根目錄生成 pyproject.toml 項(xiàng)目描述文件。內(nèi)容大概是這樣:
[tool.poetry] name = "django_dev_env_demo" version = "0.1.0" description = "" authors = ["zmrenwu <zmrenwu@163.com>"] [tool.poetry.dependencies] python = "^3.7" [tool.poetry.dev-dependencies] [build-system] requires = ["poetry>=0.12"] build-backend = "poetry.masonry.api"
安裝依賴(lài)可以使用 add 命令,例如要添加 django 依賴(lài):
$ poetry add django
poetry 會(huì)自動(dòng)將依賴(lài)寫(xiě)入 pyproject.toml 項(xiàng)目描述文件, [tool.poetry.dependencies]
的內(nèi)容變成了這樣:
[tool.poetry.dependencies] python = "^3.7" django = "^3.0.3"
如果是開(kāi)發(fā)環(huán)境下的依賴(lài),和 Pipenv 類(lèi)似,可以加 --dev 參數(shù)標(biāo)記為開(kāi)發(fā)環(huán)境依賴(lài)包:
$ poetry add pytest pytest-django --dev
Poetry 會(huì)自動(dòng)將依賴(lài)寫(xiě)入 pyproject.toml 項(xiàng)目描述文件, [tool.poetry.dev-dependencies]
的內(nèi)容變成了這樣:
[tool.poetry.dev-dependencies] pytest = "^5.3.5" pytest-django = "^3.8.0"
為了 PyCharm 自動(dòng)使用 poetry 創(chuàng)建的虛擬環(huán)境,需要在項(xiàng)目中配置 Python 解釋器為 poetry 創(chuàng)建的虛擬環(huán)境中的解釋器。
首先運(yùn)行下面的命令輸出創(chuàng)建的虛擬環(huán)境所在位置:
$ poetry env info --path C:\Users\user\.virtualenvs\django_dev_env_demo-frkNfPtg
PyCharm 中:File -> Settings -> Porject: django_dev_env_demo -> Project Interpreter。
點(diǎn)擊右上角的齒輪,再點(diǎn)擊 Add 添加虛擬環(huán)境,選擇 Existing environment,再點(diǎn)擊 Interpreter 后面的省略號(hào),選擇 poetry env info --path
輸出的虛擬環(huán)境路徑下的 Scripts/python.exe 作為解釋器。
然后點(diǎn)擊 ok 確認(rèn)就 ok 了。
這樣,在使用 PyCharm 的 Terminal 時(shí),就會(huì)自動(dòng)激活 poetry 創(chuàng)建的虛擬環(huán)境,和用 Pipenv 創(chuàng)建的虛擬環(huán)境一樣。
總結(jié)
這里給大家展示了如何使用 PyCharm + Uvicorn + Docker + AutoHotkey + Pipenv or Poetry 搭建舒適的 django 開(kāi)發(fā)環(huán)境,基本上能滿(mǎn)足大部分不是很復(fù)雜的項(xiàng)目。
要記住,無(wú)論以什么樣的方式搭建開(kāi)發(fā)環(huán)境,核心目的只有一個(gè): 讓開(kāi)發(fā)者只需關(guān)注核心業(yè)務(wù)邏輯的開(kāi)發(fā),而不是被各種環(huán)境問(wèn)題分心。
當(dāng)然,對(duì)于一些更加復(fù)雜的項(xiàng)目,在此基礎(chǔ)上我們還可以進(jìn)一步優(yōu)化環(huán)境的配置來(lái)滿(mǎn)足各種復(fù)雜的環(huán)境要求,我會(huì)在以后的文章里進(jìn)行進(jìn)一步地介紹。
到此這篇關(guān)于在 Windows 下搭建高效的 django 開(kāi)發(fā)環(huán)境的詳細(xì)教程的文章就介紹到這了,更多相關(guān)Windows 搭建django 開(kāi)發(fā)環(huán)境內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JSONLINT:python的json數(shù)據(jù)驗(yàn)證庫(kù)實(shí)例解析
本文介紹的 jsonlint 啟發(fā)自 python 的表單驗(yàn)證工具 wtforms,wtforms 通過(guò)繼承 Form 類(lèi)也能進(jìn)行 json 數(shù)據(jù)驗(yàn)證,下面通過(guò)一些例子給大家詳細(xì)介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-11-11Windows下創(chuàng)建定時(shí)任務(wù)執(zhí)行Python腳本的方法實(shí)現(xiàn)
Python定時(shí)任務(wù)執(zhí)行,本文主要介紹了Windows下創(chuàng)建定時(shí)任務(wù)執(zhí)行Python腳本的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5線(xiàn)程類(lèi)QThread詳細(xì)使用方法
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5線(xiàn)程QThread類(lèi)詳細(xì)使用方法,需要的朋友可以參考下2020-02-02Python類(lèi)方法@classmethod()的具體使用
@classmethod 是一個(gè)函數(shù)修飾符,它表示接下來(lái)的是一個(gè)類(lèi)方法,而對(duì)于平常我們見(jiàn)到的則叫做實(shí)例方法,本文主要介紹了Python類(lèi)方法@classmethod()的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01深入淺析pycharm中 Make available to all projects的含義
這篇文章主要介紹了pycharm中 Make available to all projects的含義,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Python編寫(xiě)簡(jiǎn)單的HTML頁(yè)面合并腳本
這篇文章主要介紹了Python編寫(xiě)簡(jiǎn)單的HTML頁(yè)面合并腳本的相關(guān)資料,需要的朋友可以參考下2016-07-07使用Ray集群簡(jiǎn)單創(chuàng)建Python分布式應(yīng)用程序
面對(duì)計(jì)算密集型的任務(wù),除了多進(jìn)程,就是分布式計(jì)算,如何用 Python 實(shí)現(xiàn)分布式計(jì)算呢?今天分享一個(gè)很簡(jiǎn)單的方法,那就是借助于 Ray2021-09-09scrapy框架攜帶cookie訪(fǎng)問(wèn)淘寶購(gòu)物車(chē)功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了scrapy框架攜帶cookie訪(fǎng)問(wèn)淘寶購(gòu)物車(chē),本文通過(guò)實(shí)例代碼圖文詳解給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07