Flask框架(一)
今天跟大家分享下,我之前關於flask學習的一些筆記。如果有志同道合的朋友可以互相交流交流。
Flask是第三方框架。
第一方是python官方吉多,第二方我們開發者自己,第三方框架工具類提供者。
虛擬環境
一個特殊的資料夾,裡面放著程式所需要的各種環境,比如擴充套件包,flask版本,python直譯器等內容。
不同程式選用不同虛擬環境互不影響。
知名的框架?
web:
1.flask: 提供基本功能,屬於輕量級
2.django: 提供相對完整功能,重量級
3.tornado: 偏嵌入式web應用,非阻塞式伺服器
爬蟲類:
scrapy
分散式:
spark
大資料:
hadoop
人工智慧:
scikit-learn
apache:
美國軟體基金會組織,裡面提供的都是開源框架,而且免費,比如,Tomcat,HBase,Activty..等等350多個
七行靈魂程式碼(預設埠5000)
#1.匯入Flask類
from flask import Flask
#2.建立Flask物件接收一個引數__name__,它會指向程式所在的包
app = Flask(__name__)
#3.裝飾器的作用是將路由對映到檢視函式index
@app.route('/')
def index():
return 'Hello World'
#4.Flask應用程式例項的run方法,啟動WEB伺服器
if __name__ == '__main__':
app.run()
Flask 初始化引數
import __name__:Flask 程式所在的包,傳__name__就可以,
其可以決定flask在訪問靜態檔案時查詢的路徑。
static_url_path 靜態檔案訪問路徑,可以不傳預設為/+static。
static_folder :靜態檔案儲存的資料夾,可以不傳預設為static。
template_folder:模板檔案儲存的資料夾,可以不傳,預設為templates。
Flask相關配置的載入方式
在 Flask 程式執行的時候,可以設定相關配置比如:配置 Debug 模式
從配置物件中載入(常用)
app.config.from_object()
從配置檔案中載入 app.config.from_pyfile()
從環境變數中載入(瞭解) app.config.from_envvar()
# 配置物件,裡面定義需要給 APP 新增的一系列配置
class Config(object):
DEBUG = True
# 從配置物件中載入配置
app.config.from_object(Config)
一.指定路由地址
# 指定訪問檢視函式demo1,訪問路徑為/demo1
第一種
@app.route('/demo1')
def demo1():
return 'demo1'
解決迴圈導包的方式是將非主模組在主模組中匯入
第二種
#先定義函式後用app裝飾
副模組 def detail():
return ‘detail’
在主模組中app,route(‘/detail’)(detail)
二.給路由傳參示例
有時我們需要將同一類 URL 對映到同一個檢視函式處理,比如:使用同一個檢視函式來顯示不同使用者的個人資訊。
# 路由傳遞引數,整數
@app.route('/user/<int:user_id>')
def user_info(user_id):
return 'the num is %d' % user_id
# 路由傳遞引數,字串,不指定path預設就是字串
@app.route('/user/<path:user_id>')
def user_info(user_id):
return 'hello %s' % user_id
提示:之所以int,path,float可以接收整數,字串,小數,是由於werkzeug提供了IntegerConverter,PathConverter對應轉換器.
當系統提供的轉換器滿足不了需求,需要自定義
固定格式:
1. 自定義類(轉換器),繼承自BaseConverter
2. 編寫init方法,接收兩個引數
3. 一個引數給父類空間初始化, 另外一個給子類規則初始化
4. 將自定義的轉換器,新增到系統預設的轉換器列表中 (app.url_map.converters)
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 1. 自定義類(轉換器),繼承自BaseConverter
class MyRegexConverter(BaseConverter):
#不能寫死,不夠靈活
# regex = '\d{3}'
# 2.編寫init方法, 接收兩個引數
def __init__(self,url_map,regex):
# 3.一個引數給父類空間初始化, 另外一個給子類規則初始化
super(MyRegexConverter, self).__init__(url_map)
self.regex = regex
# 4. 將自定義的轉換器,新增到系統預設的轉換器列表中(app.url_map.converters)
app.url_map.converters["re"] = MyRegexConverter
print(app.url_map.converters)
#re()好比是呼叫了init方法,引數1:app.url_map, 引數2:是括號裡面內容
@app.route('/<re("\d{3}"):number>')
def hello_world(number):
return "the number is %s"%number
jsonify(返回的json資料可以被ajax接收並在方法中可以呼叫處理)
後端返回指定的json資料型別給前端瀏覽器使用,jsonify生成json資料響應體。
return jsonify(dict)
簡化為 return jsonify(key=value,key=value)
return jsonify(name=’zhangsan’,age=”13”)
重定向
redirect(重定向),url_for,生成文字響應體
格式: redirect("地址") 自動向地址中跳轉檢視函式
注意點: redirect有個代號叫做302
url_for: 反解析,根據檢視函式名稱,找到路徑,好處:可以傳遞引數
格式:url_for('檢視函式',key=value)
@app.route('/rng')
def rng():
return redirect(url_for('lpl', token=1))
@app.route('/lol')
def lol():
return '我們有最棒的比賽<a href=%s>lpl</a>'%url_for('lpl',token=2)
@app.route('/lpl/<int:token>')
def lpl(token):
if token == 1:
return "我們是冠軍"
elif token == 2:
return "這裡是世界最強的賽區lpl!"
else:
return "LPL今年S8奪冠!"