Flask框架和Flask-Script介紹
一、裝飾器decorator
在Python中裝飾器,在Java中稱為註解;
# -*- encoding=UTF-8 ''' * 用來傳遞任意個無名字引數,這些引數會一個Tuple的形式訪問。 **用來處理傳遞任意個有名字的引數,這些引數用dict來訪問 ''' def log(level, *args, **kvargs): def inner(func): def wrapper(*args, **kvargs): print level, ': before calling ', func.__name__ print level, ': args:', args, 'kvargs:', kvargs func(*args, **kvargs) print level, ': after calling ', func.__name__ print '' return wrapper return inner @log(level='INFO') def hello(name, msg): print 'hello', name, msg if __name__ == '__main__': hello(name='nowcoder', msg='i miss you')
輸出結果:
INFO : before calling hello
INFO : args: () kvargs: {'msg': 'i miss you', 'name': 'nowcoder'}
hello nowcoder i miss you
INFO : after calling hello
二、Flask安裝和框架
1 官網
中文版本
2 框架
無論是訪問Web頁面都是一個request;
3 安裝
在命令列視窗鍵入pip install flask;
三、路由routing
1 /結尾自動補齊???
2 多對映
@app.route('/')
@app.route('/index/')
3 引數變數
@app.route('/index/<uid>')
4 變數型別
@app.route('/index/<int:uid>')舉例:
# 匯入flask模組的Flask類 from flask import Flask # 定義一個應用,一個網站就是一個應用 app = Flask(__name__) # 指定一個路徑的對映 @app.route('/') def index(): return 'hello' # 多對映 @app.route('/') @app.route('/index') def index(): return 'hello' # 傳遞傳引數變數<> @app.route('/profile/<uid>') def profile(uid): return 'profile: ' + uid # 轉化profile/後接收的資料型別 @app.route('/profile/<int:uid>') def profile(uid): return 'profile: ' + uid if __name__ =='__main__': # 執行,開啟debug模式 app.run(debug=True)
四、HTTP Method
一般網站只用GET和POST,代表獲取和更新;
HTML的form只支援GET和POST;
1 GET
獲取介面資訊;
2 HEAD
緊急檢視介面HTTP的頭;
3 POST
提交資料到伺服器;
4 PUT(少用)
支援冪等性的POST;
5 DELETE(少用)
刪除伺服器上的資源;
6 OPTIONS(少用)
檢視支援的方法;
補充:
在Chrome瀏覽器上安裝Postman,用於捕獲HTTP請求;
使某方法支援POST,則需顯式指定;
@app.route('/index', methods=['POST', 'get'])
五、靜態和模板檔案
1 靜態
預設目錄:static/templates
檔案:css/js/images
2 模板
預設目錄:templates
檔案::*.html,*.htm
六、Jinja2
1 模板語法
{{變數/表示式}}
{%語法%}
{#註釋#}
#開頭,行語法表示式:app.jinja_env.line_statement_prefix = '#'
2 語法
2.1 for
loop.index,loop.index0
loop.first,loop.cycle
{% for color in colors: %}
color{{ loop.index }}:{{color}}<br>
{% endfor %}
2.2 filter
預設目錄:templates
檔案:*.html,*.htm
2.3 模板繼承
include
extends
2.4 call/macro
{% macro render_color(color) -%}
<div>This is color: {{color}}
{{ caller() }}</div>
{%- endmacro %}
{% for color in colors: %}
{% call render_color(color) %}
render_color_demo
{% endcall %}
{% endfor %}
七、requsts和response
匯入request和make_response;
1 request物件
method:當前請求方法(POST,GET等)
url:當前連結地址
path:當前連結的路徑
environ:潛在的WSGI環境
headers:傳入的請求頭作為字典類物件
data:包含傳入的請求資料作為
args:請求連結中的引數(GET引數),解析後
form:form提交中的引數,解析後
values:args和forms的集合
json:json格式的body資料,解析後
cookies:cookie讀取
2 response物件
2.1 生成response物件
response = make_response(render_template(index.html))
2.2 方法
status:響應狀態
headers:響應頭,設定http欄位
set_coockie:設定一個cookie
舉例:
#-*-coding:utf8-*-
from flask import Flask, flash, request, make_response
app = Flask(__name__)
app.jinja_env.line_statement_prefix = '#'
app.secret_key = '123'
@app.route('/request')
def requestdemo():
key = request.args.get('key', 'defaultkey')
res = request.args.get('key', 'defaultkey')+'<br>'
res+= request.url+'<br>'+request.path+'<br>'
response=make_response(res)
response.set_cookie('rainbow', key)
response.headers['rainbow'] = 'twc' # 在Chrome瀏覽器的檢查中網路的Headers可以檢視到
return response
if __name__ == '__main__':
app.run(debug=True)
八、重定向和錯誤
匯入redirect方法;
1 重定向
redirect(location, code)
其中,location是連結路徑,code取值有301和302,301——永久轉移,302——臨時轉移;
#-*-coding:utf8-*-
from flask import Flask, flash, redirect
app = Flask(__name__)
app.jinja_env.line_statement_prefix = '#'
app.secret_key = '123'
@app.route('/newpath')
def newpath():
return 'newpath'
@app.route('/re/<int:code>')
def redirect_demo(code):
return redirect('/newpath', code=code)
if __name__ == '__main__':
app.run(debug=True)
2 error
預設情況下,每個錯誤程式碼會顯示一個黑白錯誤頁面,但使用者體驗不好;
若要定製錯誤頁面,可以使用 errorhandler() 裝飾器;
建立一個404.html檔案用於定製的錯誤頁面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>你要找的頁面去火星了</title>
</head>
<body>
<h2>抱歉,該頁面不存在</h2>
</body>
</html>
在程式中使用errorhandler()裝飾器進行錯誤頁面捕獲;
#-*-coding:utf8-*-
from flask import Flask, flash, render_template
app = Flask(__name__)
app.jinja_env.line_statement_prefix = '#'
app.secret_key = '123'
@app.errorhandler(404)
def not_found(e):
return render_template('404.html')
if __name__ == '__main__':
app.run(debug=True)
九、Flash Message
Flask提供訊息閃現機制,方便在應用中訊息提示;
首先匯入flash方法,再對secret_key進行賦值,以對訊息加密;
然後定義一個路由,使用flash(msg)方法,並返回模板;
flaskApp.py程式碼如下,功能是對輸入的使用者名稱和密碼進行相應提示;
#-*-coding:utf8-*-
from flask import Flask, flash, render_template,request
app = Flask(__name__)
app.secret_key = '123'
@app.route('/')
def hello_user():
flash("Welcomt to China")
return render_template("index.html")
@app.route('/login', methods=['POST'])
def login():
form=request.form
username=form.get('username')
password=form.get('password')
if not username:
flash("Please enter username")
return render_template("index.html")
if not password:
flash("Please enter password")
return render_template("index.html")
if username=="wencheng" and password=="123":
flash("Login succeed")
return render_template("index.html")
else:
flash("Username or password is not correcct")
return render_template("index.html")
if __name__ == '__main__':
app.run()
index.html檔案程式碼如下,get_flashed_messages從python程式獲取傳遞的資訊,呈現給使用者的樣式在這裡指定;
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>Hello Login</h1>
<!--
form標籤的action屬性是指提交表單時將資料提交到指定頁面,這裡是/login頁面
form標籤的method屬性是規定如何傳送表單資料,有post/get
-->
<form action="/login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="submit">
</form>
<h3>{{get_flashed_messages()[0]}}</h3>
</body>
</html>
十、Log
1 logging
1.1 Logger物件
其中,lvl可取值為logging.NOTSET(0)、logging.DEBUG(10)、logging.INFO(20)、logging.WARNING(30)、logging.ERROR(40)、logging.CRITICAL(50);setLevel(lvl) 設定logger級別
其中,msg是字串;debug(msg) 記錄DEBUG級別以上的日誌
info(msg) 記錄INFO級別以上的日誌
warning(msg) 記錄WARNING級別以上的日誌
error(msg) 記錄ERROR級別以上的日誌
critical(msg) 記錄CRITICAL級別以上的日誌
log(lvl, msg) 記錄指定整數值代表的日誌級別以上的日誌
1.2 Handler物件
其中,form是logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]')setLevel(lvl) 設定handler級別
setFormatter(form) 設定日誌輸出形式
debug(msg) 記錄DEBUG級別以上的日誌
info(msg) 記錄INFO級別以上的日誌
warning(msg) 記錄WARNING級別以上的日誌
error(msg) 記錄ERROR級別以上的日誌
critical(msg) 記錄CRITICAL級別以上的日誌
log(lvl, msg) 記錄指定整數值代表的日誌級別以上的日誌
1.3 模組級方法looging
basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='license.log',
filemode='w') 配置logging系統
debug(msg) 記錄DEBUG級別以上的日誌
info(msg) 記錄INFO級別以上的日誌
warning(msg) 記錄WARNING級別以上的日誌
error(msg) 記錄ERROR級別以上的日誌
critical(msg) 記錄CRITICAL級別以上的日誌
log(lvl, msg) 記錄指定整數值代表的日誌級別以上的日誌
2 flask-logging
2.1 logging to a file
RotatingFileHandler(path) 將日誌檔案中的文字進行回滾處理
其中,path指定日誌存放路徑及日誌檔名;
FileHandler(path) 將錯誤資訊加入到一個檔案中
舉例:
#-*-coding:utf8-*-
from flask import Flask
import logging
from logging.handlers import RotatingFileHandler
app = Flask(__name__)
app.jinja_env.line_statement_prefix = '#'
app.secret_key = '123'
@app.route('/log/<level>/<msg>')
def log(level, msg):
dict = {'warn': logging.WARN, 'error':logging.ERROR, 'info': logging.INFO}
if(dict.has_key(level)):
app.logger.log(dict[level], msg)
return 'logged:' + msg
def set_logger():
# RotatingFileHandler將日誌檔案中的文字資料進行回滾處理
info_file_handler = RotatingFileHandler('F:\\logs\\info.txt')
info_file_handler.setLevel(logging.INFO)
app.logger.addHandler(info_file_handler)
warn_file_handler = RotatingFileHandler('F:\\logs\\warn.txt')
warn_file_handler.setLevel(logging.WARN)
# logger.hanlder(hdlr)增加一個指定的處理器hdlr到該logger
app.logger.addHandler(warn_file_handler)
error_file_handler = RotatingFileHandler('F:\\logs\\error.txt')
error_file_handler.setLevel(logging.ERROR)
app.logger.addHandler(error_file_handler)
if __name__ == '__main__':
set_logger()
app.run(debug=True)
2.2 error mail
在debug模式為‘false’的伺服器上,通過引入logging庫檔案,引入處理類 SMTPHander,當伺服器中的app發生了錯誤報告時,會通過其設定的郵箱地址來將app的後天錯誤資訊傳送到指定的[email protected] 郵箱中,提醒管理員後臺出現錯誤資訊,及時對錯誤資訊進行處理;
舉例:
from flask import Flask
import logging
from logging.handlers import SMTPHandler
app = Flask(__name__)
app.jinja_env.line_statement_prefix = '#'
app.secret_key = '123'
@app.route('/index/<level>')
def log(level):
if(level == logging.ERROR or level == logging.CRITICAL)
app.logger.addHandler(mail_handler)
def set_logger():
ADMINS = ['[email protected]']
mail_handler = SMTPHandler('127.0.0.1',
'[email protected]',
ADMINS, 'YourApplication Failed')
mail_handler.setLevel(logging.ERROR)
if '__name__' == '__main__':
set_logger()
app.run(debug = True)
十一、flask-script
Flask Script擴充套件提供向Flask插入外部指令碼的功能,包括執行一個開發用的伺服器,一個定製的Python shell,設定資料庫的指令碼,cronjobs,及其他執行在web應用之外的命令列任務;使得指令碼和系統分開;
Flask Script和Flask本身的工作方式類似,只需定義和新增從命令列中被Manager例項呼叫的命令;
1 建立並執行命令
首先,建立一個Python模板執行命令指令碼,可起名為manager.py;
在該檔案中,必須有一個Manager例項,Manager類追蹤所有在命令列中呼叫的命令和處理過程的呼叫執行情況;
Manager只有一個引數——Flask例項,也可以是一個函式或其他的返回Flask例項;
呼叫manager.run()啟動Manager例項接收命令列中的命令;
#-*-coding:utf8-*-
from flask_script import Manager
from debug import app
manager = Manager(app)
if __name__ == '__main__':
manager.run()
其次,建立並加入命令;
有三種方法建立命令,即建立Command子類、使用@command修飾符、使用@option修飾符;
第一種——建立Command子類
Command子類必須定義一個run方法;
舉例:建立Hello命令,並將Hello命令加入Manager例項;
#-*-coding:utf8-*-
from flask_script import Manager
from flask_script import Command
from debug import app
manager = Manager(app)
class Hello(Command):
'hello world'
def run(self):
print 'hello world'
manager.add_command('hello', Hello())
if __name__ == '__main__':
manager.run()
執行如下命令:
python manager.py hello
> hello world
第二種——使用Command例項的@command修飾符
#-*-coding:utf8-*-
from flask_script import Manager
from debug import app
manager = Manager(app)
@manager.command
def hello():
'hello world'
print 'hello world'
if __name__ == '__main__':
manager.run()
該方法建立命令的執行方式和Command類建立的執行方式相同;
python manager.py hello
> hello world
第三種——使用Command例項的@option修飾符
複雜情況下,建議使用@option;
可以有多個@option選項引數;
#-*-coding:utf8-*-
from flask_script import Manager
from debug import app
manager = Manager(app)
@manager.option('-n', '--name', dest='name', help='Your name', default='world')
@manager.option('-u', '--url', dest='url', default='www.csdn.com')
def hello(name, url):
'hello world or hello <setting name>'
print 'hello', name
print url
if __name__ == '__main__':
manager.run()
執行方式如下:
python manager.py hello
>hello world
>www.csdn.com
python manager.py hello -n sissiy -u www.sissiy.com
> hello sissiy
>www.sissiy.com
相關推薦
Flask框架和Flask-Script介紹
一、裝飾器decorator 在Python中裝飾器,在Java中稱為註解; # -*- encoding=UTF-8 ''' * 用來傳遞任意個無名字引數,這些引數會一個Tuple的形式訪問。 **用來處理傳遞任意個有名字的引數,這些引數用dict來訪問 ''' de
Flask 入門一( flask 框架和 flask-script 庫)
圖片 route 路由 ima play 修改 main www QQ Flask 入門一( flask 框架 和 flask-script 庫) 一、Flask框架: 1、簡介 Flask是一個非常小的Python Web框架,被稱為微型框架;只提供了一個
Flask-Migrate和Flask-Script模組的使用
一.flask-migrate 1.功能 flask—migrate是flask的一個擴充套件模組,主要是擴充套件資料庫表結構的。 2.安裝 切換到自己的解釋其環境,執行下面命令即可安裝 pip install flask-migrate 二.flask-script 1.功能
Flask資料庫遷移擴充套件 Flask-Migrate 和 Flask-Script
使用Flsak-Migrate資料庫遷移框架,可以保證資料庫結構在發生變化時,改變資料庫結構不至於丟失資料庫的資料。使用其進行資料庫進行資料庫的遷移,主要分為三個步驟: 1 建立資料倉庫 首先通過mysql資料庫命令列新建資料庫test
python筆記-flask-migrate和flask-script
flask-migrate和flask-script應用-實現資料庫修改 # 命令列管理檔案: # - 包含資料庫遷移命令 # - 包含資料庫修改命令 from flask_migrate import Mig
解讀flask框架,flask原始碼解讀
話不多說,直接看原始碼解讀,建議先看第一版原始碼,然後往後跳版本看,再看最新的 一、建立路徑關係 裝飾器 此處endpoint,options 此處增加了self.view_functions的對應關係 二、啟動 執行werkzeug的run_simpl
Flask 框架app = Flask(__name__) 解析
#!/usr/local/bin/python # coding=utf-8 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hel
Flask框架(flask-script擴充套件命令列和flask中資料庫migrate擴充套件的使用)
flask-script擴充套件命令列 1. 安裝 : pip install Flask-Script 2. 在程式中 from flask_script import Manager &
Flask框架(flask中的請求上下文和應用上下文,以及請求鉤子的使用,Flask-Script 擴充套件命令列)
1.請求上下文與應用上下文 請求上下文(request context) request和session都屬於請求上下文物件。 應用上下文(application context) current_app和g都屬於應用上下文物
Python-Flask框架之——圖書管理系統 , 附詳解源碼和效果圖 !
數據庫 mysql AS image http 分享圖片 bubuko 書籍 sql 該圖書管理系統要實現的功能: 1. 可以通過添加窗口添加書籍或作者, 如果要添加的作者和書籍已存在於書架上, 則給出相應的提示. 2. 如果要添加的作者存在, 而要添加的書籍書架上沒有,
Flask中之數據庫框架和模型類四:再述SQLAlchemy配置和基本操作之增刪改查
模糊 offset odi com app ack 字符 add () from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) #設置連接數據庫的URL
Flask中之數據庫框架和模型類一
進行 default elf down val prim 序列 浮點 nic Python數據庫框架 # pip install flask-sqlalchemy**** 數據庫引擎 URL MySQL
三十六、python學習之Flask框架: 藍圖和單元測試
一、藍圖和單元測試: 1.藍圖: 隨著flask程式越來越複雜,我們需要對程式進行模組化的處理,之前學習過python的模組化管理,於是針對一個簡單的flask程式進行模組化處理 名詞解釋: 高內聚,低耦合: 所謂高內聚是指一個軟體模組是由相關性很強的程式碼組成,
三十一、python學習之Flask框架(三)檢視:路由、上下文、Flask-Script擴充套件
一、裝飾器路由的具體實現 1.Flask框架路由實現 Flask有兩大核心:Werkzeug和Jinja2 Werkzeug實現路由、除錯和Web伺服器閘道器介面 Jinja2實現了模板。 Werkzeug是一個遵循WSGI協議的python函式庫
Flask框架的必要性和核心特點
為什麼學習框架呢? 首先要肯定的是我們在沒有學習框架的時候同樣是可以開發web專案的,那麼為什麼我們要學習框架呢?哇,這個問題寫到這裡我都會覺得自己是個白痴! Flask框架的特點 1.輕巧 2.簡潔 3.擴充套件性強(個人認為最重要的特點) 4.核心(werkzeug和jin
python 2和python3 引用flask框架連線資料庫sqlalchemy
python 2和python3 引用flask框架連線資料庫sqlalchemy 參考:https://blog.csdn.net/guotiangong/article/details/80139612 Flask-SQLAlchemy Flask-
(六)flask框架使用教程系列——flask渲染jinja2模板和傳參
一、如何渲染jinja2模板 模板放在templates資料夾下 從flask中匯入render_template函式 在檢視函式中,使用render_template函式渲染模板。注意:只需要填寫模板的名字,不需要填寫templates這個資料夾的路徑。如果temp
(五)flask框架使用教程系列——頁面跳轉和重定向
一、頁面跳轉和重定向用處 在使用者訪問一些需要登入的頁面的時候,如果使用者沒有登入,那麼可以讓他重定向到登入頁面。 二、程式碼實現 # encoding:utf-8 from flask import Fla
python三大框架之一flask中cookie和session的相關操作
狀態保持 Cookie cookie 是指某些網站為了 辨別 使用者身份,進行會話跟蹤而儲存在使用者本地的資料(通常會經過加密),複數形式是 coolies. cookie是由伺服器端生成,傳送給客戶端瀏覽器,瀏覽器會見Cookie中的key和value儲存,下一次請求同一個瀏覽器時發給co
Flask框架裡的cookie和session
-- encoding: utf-8 -- #cookie 相關的操作,依賴與make_response庫,呼叫cookie依賴request模組 from flask import Flask,make_response,request #建立物件 app = Flask(name