初涉FlaskWeb開發----基礎篇

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密集型能夠採起多線程的形式提升效率,計算型的任務不適合;
  四、存儲優化;

相關文章
相關標籤/搜索