1. 程式人生 > >Flask框架和Flask-Script介紹

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物件

setLevel(lvl) 設定logger級別

其中,lvl可取值為logging.NOTSET(0)、logging.DEBUG(10)、logging.INFO(20)、logging.WARNING(30)、logging.ERROR(40)、logging.CRITICAL(50);

debug(msg) 記錄DEBUG級別以上的日誌

其中,msg是字串;

info(msg) 記錄INFO級別以上的日誌

warning(msg) 記錄WARNING級別以上的日誌

error(msg) 記錄ERROR級別以上的日誌

critical(msg) 記錄CRITICAL級別以上的日誌

log(lvl, msg) 記錄指定整數值代表的日誌級別以上的日誌

1.2 Handler物件

setLevel(lvl) 設定handler級別

setFormatter(form) 設定日誌輸出形式

其中,form是logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]')

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-MigrateFlask-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-migrateflask-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 2python3 引用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中cookiesession的相關操作

狀態保持 Cookie cookie 是指某些網站為了 辨別  使用者身份,進行會話跟蹤而儲存在使用者本地的資料(通常會經過加密),複數形式是 coolies. cookie是由伺服器端生成,傳送給客戶端瀏覽器,瀏覽器會見Cookie中的key和value儲存,下一次請求同一個瀏覽器時發給co

Flask框架裡的cookiesession

-- encoding: utf-8 -- #cookie 相關的操作,依賴與make_response庫,呼叫cookie依賴request模組 from flask import Flask,make_response,request #建立物件 app = Flask(name