1.web程序運行的基本流程前端
{客戶端發送請求 <-----> 服務器返回響應}python
2.使用框架能夠下降開發難度,提升開發效率。mysql
3.Flask框架的基本認識:web
特色:用Python語言實現的輕量、簡潔、擴展性強ajax
核心:werkzeug 和 Jinja2sql
4.虛擬環境:數據庫
建立虛擬環境:mkvirtualenv -p python3 名稱json
進入虛擬環境:workonflask
退出虛擬環境:deactivate後端
移除虛擬環境:rmvirtualenv 名稱
5.依賴包:
生成依賴包:pip freeze > requirements.txt
安裝依賴包:pip install -r requirements.txt
6.基本程序:
建立程序實例:__name__參數爲字符串,表示模塊名,能夠肯定程序所在位置,若是傳入標準模塊名,會影響靜態路徑的訪問,不會影響視圖函數的訪問。
定義裝飾器路由:經過程序實例調用route函數實現,底層是經過add_url_rule()函數實現,第一個參數rule、第二個參數endpoint(視圖函數名的字符串形式),第三個參數視圖函數名。
啓動服務器:run方法能夠啓動服務器,能夠指定調試debug,便於調試代碼信息,自動跟蹤代碼的變化。
1 # 導入Flask 2 from flask import Flask 3 4 # 建立Flask類的對象 5 # 結論:__name__參數的做用:確認程序實例文件所在的位置。 6 # 一、必需要傳入參數 7 # 二、參數類型必須是字符串 8 # 三、若是傳入標準模塊名,只會影響靜態路徑的訪問,不會影響視圖函數的訪問。 9 app = Flask(__name__) 10 11 12 # 定義路由url地址 13 # endpoint:表示視圖函數名的字符串形式。 14 # 不使用裝飾器也能夠實現路由映射。 15 16 @app.route('/Lee',methods=['POST','GET']) 17 def hello2018(): 18 # return 能夠返回狀態碼,也能夠返回不符合http協議的狀態碼,用來實現先後端的數據交互 19 """ 20 前端發送ajax: 21 $.ajax({ 22 url:'/Lee', 23 data:。。。, 發送到後端的數據 24 contentType:'', 發送到後端的數據類型 25 dataType:'json' 後端返回的數據類型 26 success:function(resp){ 27 if (resp == '888'){ 28 alert(errmsg) 29 }else{ 30 31 } 32 33 34 } 35 }) 36 37 errno=888,errmsg='用戶名已註冊' 38 39 40 :return: 41 """ 42 return 'hello world2018',888 43 # self.add_url_rule(rule, endpoint, f, **options) 44 # 經過程序實例調用添加url規則,也能夠實現路由映射。 45 # app.add_url_rule('/123','hello2018',hello2018) 46 47 # 結論: 48 # 一、視圖函數不能重名。 49 # 二、url能夠重複,不一樣的http請求方法,是對應不一樣的操做get查詢post插入put修改delete刪除 50 # @app.route('/') 51 # def hello2019(): 52 # a = 1 53 # b = 2 54 # return a,b 55 # 不能返回字典 56 # my_dict = {'a':'123'} 57 # return my_dict 58 # 不能返回列表 59 # my_list = [1,2,3] 60 # return my_list 61 # 能夠返回元組 62 # return 'hello world' 63 64 65 # 啓動服務器 66 # __name__表示當前模塊名,若是被導入文件的時候__name__表示文件名 67 if __name__ == '__main__': 68 # 查看路由映射:具體的url地址和視圖函數名的指向關係。 69 print(app.url_map) 70 # debug調試模式:幫助定位錯誤信息,自動跟蹤代碼的變化 71 app.run(debug=True)
7.基本程序擴展:
視圖函數不能重名
URL能夠重複,由於不一樣的http請求方法表明不一樣的操做
路徑的訪問順序是從上到下依次查找,若是找到不會繼續往下查找
8.加載配置信息:
加載配置對象
加載配置文件ini格式文件
加載環境變量
1 from flask import Flask 2 # 導入配置類 3 # from config import Config 4 from config import config_dict 5 app = Flask(__name__) 6 # 加載配置文件:三種實現形式 7 # 一、加載配置對象,config是flask內置的配置對象 8 # 重點掌握:由於擴展性更強 9 # app.config.from_object(Config) 10 # app.config.from_object(config_dict['pro']) 11 # 二、加載配置文件 12 # app.config.from_pyfile('config.ini') 13 # 三、加載環境變量 14 # app.config.from_envvar('SET') 15 16 17 @app.route('/') 18 def index(): 19 return 'hello world' 20 21 if __name__ == '__main__': 22 app.run()
config.py文件:
# 基本配置類 class Config: DEBUG = None # 開發模式配置 class DevelopmentConfig(Config): DEBUG = True # 生產模式配置 class ProductionConfig(Config): DEBUG = False # 定義字典,實現配置類的映射 config_dict = { 'dev':DevelopmentConfig, 'pro':ProductionConfig }
9.狀態碼:
return能夠返回不符合http協議的狀態碼,用來先後端的數據交互。
10.重定向:
redirect----參數是具體的URL地址
url_for ----參數是視圖函數名(端點endpoint)
# 導入flask內置的函數redirect from flask import Flask,redirect,url_for app = Flask(__name__) # 重定向redirect:接收參數爲location,具體的url地址 # 從新發送網絡請求,跳轉頁面 # 當項目路徑(url)或文件發生變化的狀況下,可使用重定向。 @app.route('/') def index(): url = 'http://www.baidu.com' # 重定向到百度 return redirect(url) # url_for反向解析:接收的參數endpoint,視圖函數名 @app.route('/for') def demo_url_for(): return redirect(url_for('index')) if __name__ == '__main__': print(app.url_map) app.run(debug=True)
11.Flask最基礎框架:
1 from flask import Flask 2 3 app = Flask(__name__) 4 5 6 @app.route("/") 7 8 def index(): 9 10 return 'hello world' 11 12 13 if __name__ == '__main__': 14 15 app.run()
12.請求上下文:
request :請求對象,封裝了客戶端請求的參數信息;
session :封裝了客戶信息,能夠用來獲取或設置用戶信息;
13.應用上下文:
g對象 :臨時請求過程當中存儲信息,請求結束後會被銷燬;
current_app : 在程序運行過程當中,一直存在,保存程序的基本信息;
14.請求勾子:
before_first_request :在第一次請求前運行
before_request:每次請求前運行
after_request:在每次請求後運次,沒有異常狀況下,指定後端返回的數據格式
teardown_request:即便沒有異常的狀況下,在每次請求後運行
15.Flask擴展命令行:自定義ip和port,配合Migrate實現數據庫的遷移
16.模板:
模板的本質是文件,做用是接收視圖的返回結果,渲染響應數據
變量:存儲視圖返回的結果 {{ 變量名 }}
判斷語句:控制輸出
{% if 表達式 %}
{% endif %}
項目中使用的atrTemplate前端模板:
{{ each house as houseas}}
數據:
{{ each }}
17.過濾器:本質是函數,做用計算或格式化輸出數據
常規過濾器名:
safe禁用模板轉義
capitalize首字符大寫:title/lower/upper/formart/striptag/reverse
列表處理:sum/sort/first/last
過濾器的使用:能夠鏈式使用,執行過程,從前到後,依次執行
18.自定義過濾器:
1.自定義函數,而後添加模板過濾器,app.add_template_filter(),第一個參數爲函數名,第二個參數爲自定義過濾器名稱,若是過濾器名和內置過濾器重名,會重寫內置過濾器;
2.以裝飾器的形式實現自定義過濾器,@app.template_filter(),只須要傳入自定義的過濾器名;
19.WTF擴展:實現模板頁面的表單代碼的複用,以及表單數據的驗證
1.自定義表單類,須要繼承自FlaskForm;
2.指定表單字段,加入驗證函數;
3.實例化表單對象,在模板頁面中使用表單對象的字段
[設置"SECRET_KEY",生成csrf_token加密口令,實現跨站請求保護,模板頁面對應的表單域中須要設置form.csrf_token()
驗證器的調用:form.validate_on_submit()執行過程,會依據調用驗證函數,其次驗證頁面中是否設置csrf_token,條件知足返回true,不然返回false]
4.表單數據的獲取,須要使用表單對象,form.字段名。data
wtf對應的csrfprotect模塊能夠生成session信息,實現跨站請求保護
20.繼承、宏、包含:三者皆可實現代碼複用
一、繼承:block,實現模板頁面固定不變的區域,通常用來寫菜單,底部欄等,模板不支持多繼承,繼承的實現須要加上區域塊的名稱;建議繼承語句寫在模板頁面的頂部;
2.宏:macro,實現模板頁面動態(功能)代碼塊的封裝,相似Python中的函數;
3.include:實現原始靜態頁面的完整複用,wtf表單對象不能複用。
21.Flask中的特殊變量和方法:
config對象:保存配置信息,設置數據庫放入鏈接、SECRET_KEY,config能夠導入配置文件,讀取配置文件;
request經常使用的屬性:args / form / data / method / files;
url_for:反向解析,實現從視圖函數找到具體的url,通常用來配合redirect實現頁面的重定向;
return redirect(url_for(視圖函數名)):重定向建議使用url_for,簡化頁面重定向的操做;
flask消息閃現,在視圖中定義提示用戶信息,在模板頁面中使用循環展現提示信息for x in get_flashed_messages()
22.數據庫:
Flask_SQLAlchemy擴展包
實力化sqlalchemy對象,須要和應用程序實例進行關聯db = sqlalchemy(app)
首先,須要手動建立數據庫,其次,配置數據庫的鏈接和動態追蹤修改
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@localhost/database'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
在請求過程自動提交數據的設置,在將來版本中會被刪除
23.自定義模型類:
1.繼承自db.Model
2.指定表的名稱,建議項目名和表名,單個表名建議使用複數
3.定義字段,db.Column()指定字段屬性約束,主鍵、外鍵、惟1、默認值等;
4.反向引用,us = db.relationship('USER',backre='role');
24.實現一對多或多對一的查詢:在數據庫中沒有具體的字段
us能夠實現多對一的查詢
role能夠實現多對一的查詢,在多的一方指定外鍵
多對多的關係映射,本質就是兩個一對多,數據的存儲在第三張表
25.db.session數據庫會話對象,封裝了對數據庫的操做
db.session.add()提交一條數據
db.session.add_all()提交多條數據
db.session.create_all()建立表
db.session.drop_all()刪除表
db.session.rollback()回滾
26. 基本查詢:
User.query.get()接收的參數爲主鍵
User.query.filter(User.id=user_id)過濾查詢,須要指定模型類的類名,須要加上執行器,all()/first()/order_by()
User.query.filter_by(id=user_id)過濾查詢,須要傳入字段名進行過濾,須要加上執行器
and_/or_/in_/notin_與或非
排序order_by/分頁limit/paginate
更新數據:User.query.filter_by(id=user_id).update({'name':'Lee'})
27. 藍圖:
1.類、模塊化應用的容器;延遲建立路由映射
2.建立藍圖對象:
api = Blueprint('api',__name__)
使用藍圖對象:
@api.route()
一、能夠在建立藍圖對象的文件中使用
二、能夠導入其餘文件中,可是須要把其餘文件再次導入到當前建立藍圖對象的文件中,須要避免循環導入的問題,交錯導入,
三、註冊藍圖路由,在建立應用程序實例的地方,app.register_blueprint(api.url_prefix='/api/v1.0')
28. 單元測試:
測試的目的:爲了檢驗功能代碼預期結果和實際結果的差距
使用unittest測試模塊
單元測試的書寫:本質是斷言代碼,
一、自定義測試類,須要繼承自unittest.TestCase
二、測試方法,setUp()方法名不能改變,通常用來定義測試代碼執行前的準備工做,包括建立客戶端,指定鏈接數據庫,構造程序實例等
三、測試方法,teatDow()方法名不能改變,通常用來定義測試代碼執行後的清除工做,好比清除測試數據,清空緩存等;
四、測試方法的函數名必須test開頭;assert斷言測試結果
29. 部署:
gunicorn -w 開啓的進程數 -b 綁定的ip和port 啓動文件名:程序實例名
正向代理:面向客戶端,服務器不知道訪問的客戶是誰
反向代理:面向服務器:客戶端不知道訪問的服務器是誰
30. REST ful API設計:
域名、版本、路徑、請求方法、返回結果、狀態碼、錯誤信息、過濾信息、數據交互格式、連接相關資源
31. 性能:
提升用戶體驗,減小響應時間
性能優化:web前端優化、web後端優化、存儲、運維優化
後端優化:
一、使用緩存,能夠把大量訪問,又不是常常修改的數據放入緩存中,好比項目首頁信息
二、使用異步:封裝請求,實現對數據異步操做;
三、多線程:線程數和硬件條件,以及對服務器的操做類型的不一樣而不一樣,IO密集型能夠採起多線程的形式提升效率,計算型的任務不適合;
四、存儲優化;