寫在前面
最近兩個月仙蚜,學(xué)會了微信小程序厂汗,學(xué)會了Flask娶桦,接著又學(xué)會了VUE前端開發(fā),學(xué)會了docker氮双,gunicorn戴差,nginx部署暖释,獨(dú)立Web開發(fā)的能力終于GET了。
內(nèi)心喜悅纹磺,寫文總結(jié)橄杨,記錄分享式矫。本文主要針對入門學(xué)習(xí)役耕,希望對大家有所幫助瞬痘。
作為程序員框全,Web開發(fā)確實(shí)很有必要去學(xué)習(xí)。因?yàn)檎麄€互聯(lián)網(wǎng)的核心技術(shù)就是Web開發(fā)技術(shù)克婶。學(xué)會了Web開發(fā)情萤,對于整個互聯(lián)網(wǎng)的認(rèn)知筋岛,對于整個編程世界的認(rèn)知晒哄,都會有非常大的提升。
Flask框架
Python三大主流Web框架:Django孝赫,F(xiàn)lask青柄,Tornado致开。
對于本人萎馅,Django入門艱難糜芳,Tornado沒有接觸耍目,F(xiàn)lask一見鐘情徐绑。
Flask傲茄,拉起一個網(wǎng)站盘榨,簡直太簡單了草巡,簡單即是美,怎不惹人愛查乒。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
Flask玛迄,拉起一個API服務(wù)后端蓖议,亦是如此簡單勒虾,如此優(yōu)雅修然。
from flask import Flask
from flask import jsonify
app = Flask(__name__)
@app.route('/api/user',methods=['GET'])
def get_user():
return jsonify(code=200, msg="用戶查詢成功!",username = '張三',userphone = '18288889999')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
Flask做API服務(wù)后端的入門學(xué)習(xí)
做API服務(wù)后端,主要是三塊內(nèi)容:路由掏婶,數(shù)據(jù)庫雄妥,身份驗(yàn)證老厌。(不需要 渲染 這塊東西了)
from flask import Flask
from flask import jsonify
from flask import request
from Tools.dbmanager import DBManager
from Tools.decoratormanager import session_jwt_verification
app = Flask(__name__)
@app.route("/bumen",methods=['GET'])
@session_jwt_verification
def goto_bumen_search():
###############查詢部門###############
sqlstring0 = "SELECT id,bumenname,bumentips FROM jr_bumen"
data0 = DBManager().executeQueryall(sqlstring0)
if data0 == False:
return_data = dict()
return_data['code'] = 5000
return_data['msg'] = "數(shù)據(jù)庫連接異常枝秤!"
return jsonify(return_data)
if data0 == None:
return_data = dict()
return_data['code'] = 5001
return_data['msg'] = "沒有部門數(shù)據(jù)淀弹!"
return jsonify(return_data)
if data0 != None:
return_data = dict()
return_data['code'] = 200
return_data['msg'] = "查詢成功薇溃!"
return_data['bumendatas'] = data0
return jsonify(return_data)
@app.route("/bumen",methods=['POST'])
@session_jwt_verification
def goto_bumen_add():
data = request.get_json()
bumen_name = data['bumenName']
bumen_tips = data['bumenTips']
###############新增部門###############
sqlstring0 = f"INSERT INTO jr_bumen (bumenname,bumentips) VALUES ('{bumen_name}','{bumen_tips}')"
data0 = DBManager().executeQueryID(sqlstring0)
if data0 == False:
return_data = dict()
return_data['code'] = 5000
return_data['msg'] = "數(shù)據(jù)庫連接異常沐序!"
return jsonify(return_data)
if data0 != None:
return_data = dict()
return_data['code'] = 200
return_data['msg'] = "部門添加成功策幼!"
return_data['bumenid'] = data0
return jsonify(return_data)
@app.route("/bumen",methods=['PUT'])
@session_jwt_verification
def goto_bumen_alter():
data = request.get_json()
bumen_id = data['bumenId']
bumen_name = data['bumenName']
bumen_tips = data['bumenTips']
###############更新部門###############
sqlstring0 = f"UPDATE jr_bumen SET bumenname='{bumen_name}',bumentips='{bumen_tips}' WHERE id= {bumen_id}"
data0 = DBManager().executeQueryNO(sqlstring0)
if data0 == False:
return_data = dict()
return_data['code'] = 5000
return_data['msg'] = "數(shù)據(jù)庫連接異常垄惧!"
return jsonify(return_data)
if data0 == True:
return_data = dict()
return_data['code'] = 200
return_data['msg'] = "部門修改成功到逊!"
return jsonify(return_data)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
1.關(guān)于數(shù)據(jù)庫
上例中的dbmanager 是本人自己寫的數(shù)據(jù)庫處理類,之前做過分享件缸。
文章鏈接:《python操作mysql數(shù)據(jù)庫的精美實(shí)用模塊》
如果要用ORM他炊,那就上Flask-SQLAlchemy庫痊末。
(ORM凿叠,相關(guān)知識嚼吞,自行百度)
2.關(guān)于身份驗(yàn)證
上例中的dsession_jwt_verification裝飾器舱禽,是自定義的誊稚,用了第三方庫:pyjwt片吊。
(JWT俏脊,相關(guān)知識爷贫,自行百度)
from flask import request
from flask import jsonify
from flask import g
from functools import wraps
import jwt
############################################################
# 裝飾器管理模塊
############################################################
def session_jwt_verification(view_func):
@wraps(view_func) # wraps函數(shù)的作用是將wrapper內(nèi)層函數(shù)的屬性設(shè)置為被裝飾函數(shù)view_func的屬性
def verify_view_func(*args, **kwargs):
try:
session_jwt = request.headers['session-jwt']
payload = jwt.decode(session_jwt, "my_jwt_secret", algorithms=['HS256'])
session_data = payload.get('userid')
g.userid = session_data
except Exception:
return jsonify(code=5901, msg="身份認(rèn)證失斅选腾务!")
###################################################################################
return view_func(*args, **kwargs)
###################################################################################
return verify_view_func
3.關(guān)于路由
實(shí)際項(xiàng)目中岩瘦,路由這里有個問題启昧,當(dāng)我們的項(xiàng)目越來越大,API越來越多時握爷,不可能把所有路由都寫在一個主文件里面吧新啼,這時就需要想辦法拆分路由了师抄。
什么辦法呢叨吮?就是藍(lán)圖BluePrint茶鉴。對涵叮,藍(lán)圖的作用就是拆分路由伞插。對于藍(lán)圖媚污,有這個理解就夠了耗美。
再配合工廠函數(shù)(對app進(jìn)行統(tǒng)一加工處理的函數(shù)),最后的主文件變成了這樣:
from flask import Flask
from Apis.login import login_api
from Apis.userdata import userdata_api
from Tools.config import config_map
####################################################################################################
# 工廠函數(shù)帝洪,對app進(jìn)行加工處理
def create_app(config_name):
app =Flask(__name__)
app.config.from_object(config_map[config_name])
###注冊API藍(lán)圖影所,并指定其對應(yīng)的前綴(url_prefix)#######################
app.register_blueprint(login_api, url_prefix="/api/login")
app.register_blueprint(userdata_api, url_prefix="/api/userdata")
###初始化app的ORM,根據(jù)實(shí)際需要開啟###################################
# from app.models import db
# db.init_app(app)
###初始化app的跨域揽涮,根據(jù)實(shí)際需要開啟###################################
# from flask_cors import CORS
# cors = CORS()
# cors.init_app(app)
###初始化app的郵件绞吁,根據(jù)實(shí)際需要開啟###################################
# from flask_mail import Mail
# mail = Mail()
# mail.init_app(app)
return app
app = create_app(config_name='development')
#####首頁視圖函數(shù)颜说,留著方便測試#############################################################
@app.route('/')
def index():
return "Jrsoft Api Server"
##################################################################################
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
整個項(xiàng)目的文件目錄是這樣:
flask-example/
├── Apis
│ ├── login.py
│ └── userdata.py
├── Tools
│ ├── config.py
│ ├── dbmanager.py
│ └── decoratormanager.py
└── main.py
4.其他一些說明
Flask做API服務(wù)后端门粪,相關(guān)的知識點(diǎn)還是蠻多的玄妈,需要自己找資料拟蜻,逐一消化理解枯饿。核心內(nèi)容就是上述三塊:路由奢方,數(shù)據(jù)庫蟋字,身份驗(yàn)證鹊奖。
當(dāng)然嫉入,做API服務(wù)后端咒林,還有一些其他框架垫竞,比較火爆強(qiáng)勁的就有FastAPI,大家可以了解一下欢瞪,長得跟Flask有點(diǎn)像活烙,但底層跟Flask不一樣。(反正我沒用遣鼓,還是用的Flask)
還有Flask項(xiàng)目本身的開發(fā)大神 李輝 做的API框架:APIFlask啸盏,可以關(guān)注一下,是基于Flask開發(fā)的骑祟。(這個框架成熟后回懦,我會用起來)
微信小程序的入門學(xué)習(xí)
好了次企,后端Flask搞定怯晕,咱接著說前端,先說微信小程序吧缸棵,然后再說Vue舟茶。
微信小程序,其官方文檔就很詳盡了堵第,基本上看官方文檔就足夠了吧凉,當(dāng)然根據(jù)自身情況,再去B站找些視頻看看踏志,輔助學(xué)習(xí)就可以了阀捅,沒必要買書了。
鏈接在此:微信小程序官方文檔
官方文檔之中狰贯,有一份《小程序開發(fā)指南》也搓,其實(shí)就是新手入門指南。入門必看涵紊!多看幾遍傍妒!隨著自身項(xiàng)目,邊看邊做邊學(xué)摸柄,基本就會了颤练。
而開發(fā)指南之中,又有一小節(jié)驱负,文檔之中一筆帶過嗦玖,但是你絕不可錯過,叫【2.3.6 官方樣式庫】跃脊。
為了減輕開發(fā)者樣式開發(fā)的工作量宇挫,我們提供了WeUI.wxss基礎(chǔ)樣式庫。
WeUI是一套與微信原生視覺體驗(yàn)一致的基礎(chǔ)樣式庫酪术,由微信官方設(shè)計(jì)團(tuán)隊(duì)為微信內(nèi)網(wǎng)頁和微信小程序量身設(shè)計(jì)器瘪,令用戶的使用感知更加統(tǒng)一翠储。包含button、cell橡疼、dialog援所、progress、toast欣除、article住拭、actionsheet、icon等各式原生历帚。
具體使用文檔可參考:https://github.com/Tencent/weui-wxss
作為獨(dú)立開發(fā)者滔岳,假如沒有這種東西,難道讓我們自己去寫樣式去搞UI設(shè)計(jì)嗎抹缕?這要開發(fā)到何年馬月澈蟆!
類似WeUI,還有一個有贊出品的UI 組件庫卓研,也非常有名趴俘,美觀而好用,叫:Vant
Vant的官網(wǎng):https://vant-contrib.gitee.io/vant-weapp
文檔很詳盡奏赘,入手很簡單寥闪,自己去看吧。
Vue的入門學(xué)習(xí)
Flask做API服務(wù)后端搞定了磨淌,微信小程序也學(xué)會搞定了疲憋,想著是時候回頭搞網(wǎng)站了吧。
Flask是web框架梁只,本就是搞網(wǎng)站用的缚柳,搞網(wǎng)站就要用到Flask的網(wǎng)頁渲染功能。
Flask的網(wǎng)頁渲染功能搪锣,主要靠的就是:Jinja2模板引擎和render_template渲染函數(shù)秋忙。
學(xué)這塊內(nèi)容時,我是比較煩的构舟,可能習(xí)慣了以前從事游戲開發(fā)時前后端分離的開發(fā)思維灰追,這種前端夾著后端,傻傻分不清了狗超,學(xué)著就有點(diǎn)難受弹澎,也不好學(xué)進(jìn)去。
想想我都用Flask做API服務(wù)后端努咐,WEB開發(fā)前后端分離又是大勢所趨苦蒿,索性Flask的渲染不學(xué)了,火熱的前端框架Vue搞起了渗稍!
要學(xué)Vue刽肠,當(dāng)然先要學(xué)Node.js溃肪,要會NPM免胃。這Node.js的NPM就如同Python的pip音五,都是包管理工具。
Vue之下羔沙,類似微信小程序的WeUI和Vant躺涝,有一個餓了么出品的UI組件庫,也非常有名扼雏,叫:ElementUI坚嗜。
Vue有Vue2和Vue3兩個版本,我直接用的Vue3诗充,對應(yīng)的ElementUI版本叫:ElementUI-plus苍蔬。
ElementUI-plus的官網(wǎng):https://element-plus.gitee.io/zh-CN/
另外,其實(shí)類似WeUI蝴蜓,Vant碟绑,ElementUI這樣的UI樣式庫和組件庫,還有不少茎匠,如:賢心的LayUI格仲,阿里的 Ant Design......
在這里,真的要感謝這些UI樣式庫和組件庫的分享公司诵冒,團(tuán)隊(duì)或大神凯肋,沒有這些樣式庫和組件庫,像我這樣的個體開發(fā)者真的都不知道怎么在web開發(fā)上繼續(xù)下去汽馋。
之前侮东,我在web開發(fā)上的學(xué)習(xí),就是卡在了前端頁面的構(gòu)建上豹芯,內(nèi)心形成了一種恐懼悄雅。而自從了解到有這些樣式庫和組件庫的存在,前端瞬間變得輕松簡單了告组,開發(fā)瞬間變得美好起來煤伟。
Docker的入門學(xué)習(xí)
前后端搞定,代碼開發(fā)完成木缝,最后當(dāng)然要放到真正運(yùn)行的服務(wù)器上便锨,這就是部署了。
高級的部署方法是基于容器進(jìn)行部署我碟。Docker 就是目前最流行的容器平臺放案。
(Docker ,相關(guān)知識矫俺,自行百度)
微信小程序的部署吱殉,直接上傳代碼即可掸冤,下面主要分享Flask+Vue的網(wǎng)站部署
1.項(xiàng)目目錄結(jié)構(gòu)
myweb_project/
│
├── flask
│ ├── Dockerfile
│ ├── gunicorn.config.py
│ └── flask_app # flask項(xiàng)目的代碼
│
├── mysql
│ ├── Dockerfile
│ └── myweb.sql
│
├── nginxvue
│ ├── dist # 打包的vue項(xiàng)目
│ ├── Dockerfile
│ └── nginx.conf
│
└──docker-compose.yml
2.Docker+Gunicorn 部署 flask后端
gunicorn.config.py文件如下:
import multiprocessing
bind = '0.0.0.0:9191' # 監(jiān)聽內(nèi)網(wǎng)端口80
backlog = 512
timeout = 30
worker_class = 'gevent' # 工作模式協(xié)程
workers = multiprocessing.cpu_count() * 2 + 1 # 并行工作進(jìn)程數(shù)
threads = 2 # 指定每個工作者的線程數(shù)
pidfile = 'gunicorn.pid' # 設(shè)置進(jìn)程文件目錄
loglevel = 'info' # 設(shè)置日志記錄水平
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
accesslog = "gunicorn_access.log" # 訪問信息日志文件
errorlog = "gunicorn_error.log" # 錯誤信息日志文件
reload=True # 代碼發(fā)生變化是否自動重啟
Dockerfile文件如下:
FROM python:3.8
WORKDIR /Project/jrsoftdemo
COPY . .
RUN pip install -r Tools/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
CMD gunicorn -k gevent -w 5 -b 0.0.0.0:8080 backend:app
3.Docker+Nginx 部署 Vue前端
nginx.conf文件如下:
server {
listen 8080;
server_name localhost;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / { # 直接匹配端口返回前端
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /api/ { # 匹配api的,轉(zhuǎn)發(fā)給后端友雳,
rewrite /api/(.*) /$1 break;
proxy_pass http://192.168.99.100:9999; # 這里是宿主機(jī)的ip
}
}
Dockerfile文件如下:
# 設(shè)置基礎(chǔ)鏡像
FROM nginx
# 將dist文件中的內(nèi)容復(fù)制到 /usr/share/nginx/html/ 這個目錄下面
COPY dist/ /usr/share/nginx/html/
#用本地的 nginx.conf 配置來替換nginx鏡像里的默認(rèn)配置
COPY nginx.conf /etc/nginx/conf.d/default.conf
4.Docker部署 mysql數(shù)據(jù)庫
如果你的項(xiàng)目稿湿,數(shù)據(jù)庫也需要Docker部署,當(dāng)然也是可以的押赊。
Dockerfile文件如下:
FROM mysql:5.7.20
部署成功之后饺藤,數(shù)據(jù)庫軟件通過IP連入,便可查看管理流礁。
5.Docker的相關(guān)命令
# 創(chuàng)建鏡像
docker build -t jrsoftflask .
# 啟動生產(chǎn)環(huán)境
docker run -p 9999:9191 --name jrsoft_demo -d jrsoftflask
# 查看鏡像
docker images
# 刪除鏡像
docker rmi -f e7cd0fde3f42
# 進(jìn)入docker鏡像環(huán)境
docker run -it jrsoftflask /bin/bash
# 列出運(yùn)行容器
docker ps
# 列出全部容器
docker ps -a
# docker遠(yuǎn)程服務(wù)器部署——方案一:tar打包法
# 生成tar
docker save jrsoftflask>images.tar
# 加載tar
docker load < images.tar
# docker遠(yuǎn)程服務(wù)器部署——方案二:鏡像云倉庫法
# 將本地鏡像推到[遠(yuǎn)程倉庫]--DockerHub/阿里云Docker倉庫/騰訊云Docker倉庫
docker push 178.104.162.39/dev/vdi-controller:arm0324
# 從[遠(yuǎn)程倉庫]拉取鏡像--DockerHub/阿里云Docker倉庫/騰訊云Docker倉庫
docker pull 178.104.162.39/dev/vdi-controller:arm0324
6.docker-compose編排
像Flask+微信小程序涕俗,只需要用一個docker容器部署Flask就可以了,自然不需要docker-compose編排神帅。
而像Flask+Vue項(xiàng)目再姑,用到多個docker容器,那用docker-compose編排找御,一鍵拉起元镀,自然更加方便。
docker-compose.yml文件如下:
version: '3'
services:
mysql:
build: ./mysql
ports:
- "3306:3306"
container_name: mysql
environment:
- MYSQL_ROOT_PASSWORD=mypws123456789
restart: always
flask:
build: ./flask
ports:
- "9999:9191"
container_name: flask
restart: always
volumes:
- "./flask/lab_app:/root/lab_app"
nginx:
build: ./nginxvue
ports:
- "8080:8080"
container_name: nginxvue
# 啟動命令
docker-compose up -d
7.注意事項(xiàng)
Docker部署萎坷,需要注意每個容器的IP和端口凹联,假若設(shè)置不對就連不上了。
在docker-compose編排的時候哆档,可進(jìn)行相應(yīng)的網(wǎng)絡(luò)設(shè)置蔽挠,上面文件并未涉及,大家可自行研究瓜浸。
自學(xué)方法
1.git和github
現(xiàn)在的程序員澳淑,git基本必學(xué)了,沒什么好說的插佛。一般用用的話杠巡,掌握幾條命令就可以了
# 創(chuàng)建倉庫
git init
# 添加到暫存區(qū)
git add .
# 提交到倉庫
git commit -m '提交注釋'
# 關(guān)聯(lián)遠(yuǎn)程倉庫
git remote add origin git@github.com:......
# 推送到遠(yuǎn)程倉庫
git push -u origin master
# 克隆遠(yuǎn)程倉庫
git clone git@github.com:......
學(xué)習(xí)git,自然會用上github雇寇。github上好東西太多了氢拥,想找什么源碼,盡管去上面搜索好了锨侯。
所以嫩海,這里有個入門捷徑:先去github,搜幾個簡單的項(xiàng)目源碼囚痴,下載下來進(jìn)行學(xué)習(xí)叁怪,看看別人都是怎么做的,最簡單的項(xiàng)目是怎么搭建的深滚,如此入門再好不過了奕谭!
后面有時間有機(jī)會涣觉,我也會寫幾個入門項(xiàng)目源碼,上傳到github血柳,屆時分享給大家官册。
2.自己的項(xiàng)目
看別人的文章,看別人的視頻混驰,看別人的源碼攀隔,終究是順著別人的思維,看的時候貌似都會了栖榨,其實(shí)往往離真正會做還有一段距離。
所以明刷,這里有個入門捷徑:學(xué)東西前婴栽,先有一個自己的項(xiàng)目,越現(xiàn)實(shí)越具體越好辈末。
不管是自己主動構(gòu)想的項(xiàng)目愚争,還是他人被動賦予的項(xiàng)目,都很好挤聘,只要有了項(xiàng)目轰枝,便有了明確的目標(biāo)。
然后邊做邊學(xué)组去,邊學(xué)邊做鞍陨,學(xué)以致用,知行合一从隆,如此最快诚撵,做才是真正的得到!
3.目標(biāo)拆分法
目標(biāo)往往很大键闺,任務(wù)往往艱巨寿烟。不要怕,拆分他辛燥!
目標(biāo)拆分法是做事萬能法筛武,不管是做項(xiàng)目,還是學(xué)習(xí)挎塌,不管是寫程序徘六,還是寫小說......
目標(biāo)越大,越需要拆分勃蜘,拆分成一個個小目標(biāo)硕噩,一個個可執(zhí)行的不讓人恐懼的小目標(biāo)。
然后一個小目標(biāo)一個小目標(biāo)的去完成缭贡,像做游戲任務(wù)一樣炉擅,像玩游戲闖關(guān)一樣辉懒,按部就班,逐個擊破即可谍失。
這目標(biāo)拆分法眶俩,也是管理學(xué)中的方法,也是游戲設(shè)計(jì)中的一大核心要義快鱼。
游戲有四要素:目標(biāo)颠印,規(guī)則,反饋抹竹,自愿參與线罕。
你看,你將學(xué)習(xí)目標(biāo)拆分成多個可執(zhí)行的小目標(biāo)后窃判,還可以給每個小目標(biāo)設(shè)定完成獎勵钞楼,如此一來,你可以將學(xué)習(xí)轉(zhuǎn)化為游戲一般好玩袄琳,這叫學(xué)習(xí)游戲化询件。
寫在最后,網(wǎng)站開發(fā)唆樊,我的心愿
大約10年以前宛琅,不做游戲策劃之后,便萌生了一個想法:要學(xué)會網(wǎng)站開發(fā)逗旁,做自己想做的網(wǎng)站嘿辟。
而在正式轉(zhuǎn)做程序員之后,這個想法也便隨之變得愈加強(qiáng)烈和執(zhí)著痢艺,已然成為了人生的必達(dá)目標(biāo)仓洼,人生的一個心愿。
而且堤舒,時常心想:一個程序員色建,如果連網(wǎng)站開發(fā)都不會,當(dāng)別人問你什么工作時舌缤,好意思跟別人說自己是程序員箕戳,是軟件開發(fā)工程師嗎?
所以国撵,很早以前陵吸,便看了html,css介牙,javascript壮虫,但是看懂了又如何?真正搞起網(wǎng)站來,依然一臉懵逼囚似。
后來剩拢,為了搭建網(wǎng)站,也接觸了wordpress等等各種搭建網(wǎng)站的工具饶唤,但這些畢竟都只是工具徐伐,并不是自己想要的能力——真正網(wǎng)站開發(fā)的能力。
后來會了python募狂,便開始學(xué)python的web框架django办素,可是對我來說django似乎太復(fù)雜了,起手學(xué)了兩次祸穷,每次花了兩三天還感覺門都沒摸著性穿,也便興味索然,算了算了粱哼。
后來工作之中季二,同事請我?guī)兔Υ罱ㄒ粋€API服務(wù),那時我也不真正清楚什么是API服務(wù)揭措,但我自信我大python啥不能干,網(wǎng)上一搜刻蚯,短短幾行代碼便能搭建绊含,so easy,便應(yīng)下了同事的任務(wù)炊汹,幫忙完成了這個API服務(wù)躬充。而這一次任務(wù)中,用的正是python的另一個web框架——flask讨便。
flask充甚,短短幾行代碼,簡單明了霸褒,便能搭建api服務(wù)伴找,便能搭建網(wǎng)站,簡直太棒了废菱,一見鐘情技矮。
于是,正式開始學(xué)習(xí)flask殊轴,以書本《Flask Web開發(fā)》(米格爾格林貝格 著)為主要教材衰倦,以B站大神們分享的flask視頻為輔助學(xué)習(xí)。
《Flask Web開發(fā)》旁理,逐字逐句閱讀樊零,逐行代碼敲下,學(xué)了大半個月孽文,仿佛都學(xué)下來了驻襟,其實(shí)很多概念并不清晰夺艰,很多東西把握不住。自己很清楚塑悼,真正動手去做劲适,根本沒把握獨(dú)自開發(fā)一個網(wǎng)站,所以說到底厢蒜,知識還是沒有內(nèi)化霞势,功夫還是沒有學(xué)到。于是斑鸦,停了停愕贡,又放了一段時間。
后來巷屿,那個同事又找我?guī)兔ψ鑫⑿判〕绦蚬桃浴N⑿判〕绦蜷_發(fā),我也是摸了好幾次嘱巾,也想學(xué)也是一直學(xué)不會憨琳,但現(xiàn)在有了flask的半吊子功夫,心里是有點(diǎn)底的旬昭,知道整體是怎么搭建的篙螟,都需要哪些知識技能,而且我內(nèi)心太喜歡這種全新的實(shí)際項(xiàng)目了问拘,因?yàn)槲抑辣槁裕谶@種實(shí)際項(xiàng)目上,邊做邊學(xué)骤坐,又有項(xiàng)目的現(xiàn)實(shí)約束绪杏,學(xué)東西才是最快的。
于是纽绍,接下來蕾久,大概一個月,我真正學(xué)會了微信小程序顶岸,學(xué)會了Flask腔彰,接著一個月,又學(xué)會了VUE前端開發(fā)辖佣,學(xué)會了docker霹抛,gunicorn,nginx部署卷谈,當(dāng)然稱不上完全了解和精通杯拐,但獨(dú)立搭建網(wǎng)站已經(jīng)沒有問題了,更深入的原理知識根據(jù)實(shí)際需求再去了解即可《吮疲總之朗兵,當(dāng)前的程度對我來說基本足夠了,此生一個心愿也算了了顶滩。
心愿已了余掖,技能獲得,內(nèi)心歡喜礁鲁,寫下此文盐欺,以作總結(jié),留做記錄仅醇,分享于此冗美。