亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python的Flask開發框架簡單上手筆記

2020-01-04 17:57:24
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了Python的Flask開發框架的入門知識整理,Flask是一款極輕的Python web開發框架,需要的朋友可以參考下

最簡單的hello world

 

 
  1. #!/usr/bin/env python 
  2. # encoding: utf-8 
  3.  
  4. from flask import Flask 
  5. app = Flask(__name__) 
  6.  
  7. @app.route('/'
  8. def index(): 
  9. return 'hello world' 
  10.  
  11. if __name__ == '__main__'
  12. app.run(debug=True) 
  13. #app.run(host='127.0.0.1', port=8000) 

之后,訪問http://localhost:5000

支持post/get提交

 

 
  1. @app.route('/', methods=['GET''POST']) 

多個url指向

 

 
  1. @app.route('/'
  2. @app.route('/index'

不管post/get使用統一的接收

 

 
  1. from flask import request 
  2. args = request.args if request.method == 'GET' else request.form 
  3. a = args.get('a''default'

處理json請求

request的header中

 

 
  1. "Content-Type""application/json" 

處理時:

 

 
  1. data = request.get_json(silent=False) 

獲取post提交中的checkbox

 

 
  1. {%for page in pages %} 
  2. <tr><td><input type=checkbox name=do_delete value="{{ page['id'] }}"></td><td> 
  3. {%endfor%} 
  4.  
  5. page_ids = request.form.getlist("do_delete"

使用url中的參數

 

 
  1. @app.route('/query/<qid>/'
  2. def query(qid): 
  3. pass 

在request開始結束dosomething

一般可以處理數據庫連接等等

 

 
  1. from flask import g 
  2.  
  3. app = ..... 
  4.  
  5. @app.before_request 
  6. def before_request(): 
  7. g.session = create_session() 
  8.  
  9. @app.teardown_request 
  10. def teardown_request(exception): 
  11. g.session.close() 

注冊Jinja2模板中使用的過濾器

 

 
  1. @app.template_filter('reverse'
  2. def reverse_filter(s): 
  3. return s[::-1] 

或者

 

 
  1. def reverse_filter(s): 
  2. return s[::-1] 
  3. app.jinja_env.filters['reverse'] = reverse_filter 

可以這么用

 

 
  1. def a():... 
  2. def b():... 
  3.  
  4. FIL = {'a': a, 'b':b} 
  5. app.jinja_env.filters.update(FIL) 

注冊Jinja2模板中使用的全局變量

 

 
  1. JINJA2_GLOBALS = {'MEDIA_PREFIX''/media/'
  2. app.jinja_env.globals.update(JINJA2_GLOBALS) 

定義應用使用的template和static目錄

 

 
  1. app = Flask(__name__, template_folder=settings.TEMPLATE_FOLDER, static_folder = settings.STATIC_PATH) 

使用Blueprint

 

 
  1. from flask import Blueprint 
  2. bp_test = Blueprint('test', __name__) 
  3. #bp_test = Blueprint('test', __name__, url_prefix='/abc') 
  4.  
  5. @bp_test.route('/'
  6.  
  7. -------- 
  8. from xxx import bp_test 
  9.  
  10. app = Flask(__name__) 
  11. app.register_blueprint(bp_test) 

實例:

 

 
  1. bp_video = Blueprint('video', __name__, url_prefix='/kw_news/video'
  2. @bp_video.route('/search/category/', methods=['POST''GET']) 
  3. #注意這種情況下Blueprint中url_prefix不能以 '/' 結尾, 否則404 

使用session

包裝cookie實現的,沒有session id

 

 
  1. app.secret_key = 'PS#yio`%_!((f_or(%)))s' 

然后

 

 
  1. from flask import session 
  2.  
  3. session['somekey'] = 1 
  4. session.pop('logged_in', None) 
  5.  
  6. session.clear() 
  7.  
  8. #過期時間,通過cookie實現的 
  9. from datetime import timedelta 
  10. session.permanent = True 
  11. app.permanent_session_lifetime = timedelta(minutes=5) 

反向路由

 

 
  1. from flask import url_for, render_template 
  2.  
  3. @app.route("/"
  4. def home(): 
  5. login_uri = url_for("login", next=url_for("home")) 
  6. return render_template("home.html", **locals()) 

上傳文件

 

 
  1. <form action="/image/upload/" method="post" enctype="multipart/form-data"
  2. <input type="file" name="upload" /> 

接收

 

 
  1. f = request.files.get('upload'
  2. img_data = f.read() 

直接返回某個文件

 

 
  1. return send_file(settings.TEMPLATE_FOLDER + 'tweet/tweet_list.html'

請求重定向

 

 
  1. flask.redirect(location, code=302) the redirect status code. defaults to 302.Supported codes are 301, 302, 303, 305, and 307. 300 is not supported. 
  2.  
  3. @app.route('/'
  4. def hello(): 
  5. return redirect(url_for('foo')) 
  6.  
  7. @app.route('/foo'
  8. def foo(): 
  9. return'Hello Foo!' 

獲取用戶真實ip

從request.headers獲取

real_ip = request.headers.get('X-Real-Ip', request.remote_addr)

或者, 使用werkzeug的middleware 文檔

 

 
  1. from werkzeug.contrib.fixers import ProxyFix 
  2. app.wsgi_app = ProxyFix(app.wsgi_app) 
  3. return json & jsonp 
  4. import json 
  5. from flask import jsonify, Response, json 
  6.  
  7. data = [] # or others 
  8. return jsonify(ok=True, data=data) 
  9.  
  10. jsonp_callback = request.args.get('callback'''
  11. if jsonp_callback: 
  12. return Response( 
  13. "%s(%s);" % (jsonp_callback, json.dumps({'ok': True, 'data':data})), 
  14. mimetype="text/javascript" 
  15. return ok_jsonify(data) 

配置讀取方法

 

 
  1. # create our little application :) 
  2. app = Flask(__name__) 
  3.  
  4. # Load default config and override config from an environment variable 
  5. app.config.update(dict( 
  6. DATABASE='/tmp/flaskr.db'
  7. DEBUG=True, 
  8. SECRET_KEY='development key'
  9. USERNAME='admin'
  10. PASSWORD='default' 
  11. )) 
  12. app.config.from_envvar('FLASKR_SETTINGS', silent=True) 
  13.  
  14.  
  15. ------------------ 
  16. # configuration 
  17. DATABASE = '/tmp/minitwit.db' 
  18. PER_PAGE = 30 
  19. DEBUG = True 
  20. SECRET_KEY = 'development key' 
  21.  
  22. # create our little application :) 
  23. app = Flask(__name__) 
  24. app.config.from_object(__name__) 
  25. app.config.from_envvar('MINITWIT_SETTINGS', silent=True) 

幾個不常用的方法

 

 
  1. from flask import abort, flash 
  2.  
  3. abort 
  4. if not session.get('logged_in'): 
  5. abort(401) 
  6.  
  7. flash 
  8. flash('New entry was successfully posted'

異步調用

想在flask的一個請求中處理異步, 除了使用消息系統, 可以用簡單的線程處理

 

 
  1. from threading import Thread 
  2.  
  3. def async(f): 
  4. def wrapper(*args, **kwargs): 
  5. thr = Thread(target=f, args=args, kwargs=kwargs) 
  6. thr.start() 
  7. return wrapper 
  8.  
  9. @async 
  10. def dosomething(call_args): 
  11. print call_args 
  12.  
  13.  
  14. in a request handler, call `dosomething` 
  15. error handler 
  16. @app.errorhandler(404) 
  17. def not_found_error(error): 
  18. return render_template('404.html'), 404 
  19.  
  20. @app.errorhandler(500) 
  21. def internal_error(error): 
  22. db.session.rollback() 
  23. return render_template('500.html'), 500 

項目配置

1.直接

 

 
  1. app.config['HOST']='xxx.a.com' 
  2. print app.config.get('HOST'

2.環境變量

 

 
  1. export MyAppConfig=/path/to/settings.cfg 
  2. app.config.from_envvar('MyAppConfig'

3.對象

 

 
  1. class Config(object): 
  2. DEBUG = False 
  3. TESTING = False 
  4. DATABASE_URI = 'sqlite://:memory:' 
  5.  
  6. class ProductionConfig(Config): 
  7. DATABASE_URI = 'mysql://user@localhost/foo' 
  8.  
  9. app.config.from_object(ProductionConfig) 
  10. print app.config.get('DATABASE_URI') # mysql://user@localhost/foo 

4.文件

 

 
  1. # default_config.py 
  2. HOST = 'localhost' 
  3. PORT = 5000 
  4. DEBUG = True 
  5.  
  6. app.config.from_pyfile('default_config.py'

EG. 一個create_app方法

 

 
  1. from flask import Flask, g 
  2.  
  3. def create_app(debug=settings.DEBUG): 
  4. app = Flask(__name__, 
  5. template_folder=settings.TEMPLATE_FOLDER, 
  6. static_folder=settings.STATIC_FOLDER) 
  7.  
  8. app.register_blueprint(bp_test) 
  9.  
  10. app.jinja_env.globals.update(JINJA2_GLOBALS) 
  11. app.jinja_env.filters.update(JINJA2_FILTERS) 
  12.  
  13. app.secret_key = 'PO+_)(*&678OUIJKKO#%_!(((%)))' 
  14.  
  15. @app.before_request 
  16. def before_request(): 
  17. g.xxx = ... #do some thing 
  18.  
  19. @app.teardown_request 
  20. def teardown_request(exception): 
  21. g.xxx = ... #do some thing 
  22.  
  23. return app 
  24.  
  25. app = create_app(settings.DEBUG) 
  26. host=settings.SERVER_IP 
  27. port=settings.SERVER_PORT 
  28. app.run(host=host, port=port) 
  29. change log: 
  30.  
  31. 2013-09-09 create 
  32. 2014-10-25 update 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美在线一区| 国产日产欧美精品| 成人免费视频a| 日日噜噜噜夜夜爽亚洲精品| 国产成人一区二区三区小说| 亚洲国产精品专区久久| 久久久人成影片一区二区三区观看| 色婷婷av一区二区三区在线观看| 在线观看中文字幕亚洲| 欧美成人免费全部观看天天性色| 成人激情春色网| 亚洲成人久久久久| 国产亚洲视频中文字幕视频| 一区二区av在线| 欧美第一黄网免费网站| 精品在线小视频| 欧美视频在线观看 亚洲欧| 欧美午夜视频在线观看| 欧美电影免费观看高清完整| 在线成人激情视频| 68精品国产免费久久久久久婷婷| 亚洲综合在线中文字幕| 成人免费观看49www在线观看| 欧美一级高清免费播放| 亚洲激情国产精品| 亚洲午夜久久久久久久| 欧美富婆性猛交| 久久九九有精品国产23| 日韩综合中文字幕| 91av视频在线观看| 亚洲国语精品自产拍在线观看| 91亚洲精品久久久| 欧美日韩在线视频首页| 亚洲美女又黄又爽在线观看| 97久久久久久| 91大神在线播放精品| 久久精品一偷一偷国产| www.亚洲成人| xxx成人少妇69| 国产成人精品综合久久久| 国内精品美女av在线播放| 欧美日韩国产精品一区二区不卡中文| 黑人与娇小精品av专区| 欧美在线中文字幕| 国产精品福利无圣光在线一区| 亚洲精品视频播放| 91网站在线免费观看| 亚洲精选一区二区| 亚洲精品乱码久久久久久按摩观| 日韩欧美在线播放| 国内精品久久久久久中文字幕| 日韩在线观看电影| 欧美性猛交xxxx黑人| 热久久这里只有精品| 日韩成人高清在线| 国产三级精品网站| 久久6免费高清热精品| 久久久久久久久久久国产| 亚洲片在线资源| 国产在线精品自拍| 成人动漫网站在线观看| 久久香蕉国产线看观看av| 全色精品综合影院| 国产欧美一区二区三区久久| 国产成人精彩在线视频九色| 日韩精品免费看| 国产精品久久久久久久久粉嫩av| 久久不射热爱视频精品| 欧美日韩在线一区| 亚洲第一精品福利| 国产精品狠色婷| 国产一区二区三区精品久久久| 免费不卡在线观看av| 91精品国产综合久久香蕉的用户体验| 国产999视频| 日韩**中文字幕毛片| 91欧美日韩一区| 中文字幕日韩精品在线| 日韩高清免费观看| 成人精品一区二区三区电影黑人| 国产日韩视频在线观看| 亚洲精品丝袜日韩| 日韩欧美在线第一页| 日韩网站在线观看| 伊人一区二区三区久久精品| 亚洲精美色品网站| 日韩风俗一区 二区| 欧美日韩在线免费| 日韩精品极品在线观看播放免费视频| 国产a∨精品一区二区三区不卡| 91av福利视频| 97精品视频在线观看| 久99久在线视频| 正在播放亚洲1区| 亚洲天堂免费观看| 日韩高清欧美高清| 91精品国产91久久| www欧美日韩| 亚洲精品色婷婷福利天堂| 国产日韩欧美成人| 国产主播精品在线| 国产亚洲欧美一区| 国产精品女人网站| 欧美高清videos高潮hd| 久久91亚洲精品中文字幕| 欧美激情视频播放| 久热精品视频在线观看| 亚洲一区二区三区四区在线播放| 日韩成人高清在线| 久久久99免费视频| 亚洲国产成人精品一区二区| 亚洲综合在线做性| 亚洲欧美在线磁力| 国产精国产精品| 亚洲护士老师的毛茸茸最新章节| 97视频人免费观看| 亚洲精品视频中文字幕| 日本欧美一级片| 日韩免费精品视频| 精品日韩中文字幕| 国产成人精品综合久久久| 国产精品三级美女白浆呻吟| 欧美日韩成人在线播放| 91影院在线免费观看视频| 欧美亚洲伦理www| 精品国产乱码久久久久久婷婷| 亚洲美女动态图120秒| 中文字幕一区二区精品| 欧美中文字幕在线视频| 国产日韩在线看| 一区二区日韩精品| 日韩毛片在线看| 欧美黑人极品猛少妇色xxxxx| 亚洲视频在线观看网站| 一本一本久久a久久精品综合小说| 国产精品久久久久久久一区探花| 国内精品美女av在线播放| 成人写真福利网| 亚洲电影中文字幕| 久久久久一本一区二区青青蜜月| 18性欧美xxxⅹ性满足| 91极品视频在线| 97激碰免费视频| 中文字幕视频在线免费欧美日韩综合在线看| 久久精品国产清自在天天线| 亚洲国产日韩精品在线| 精品爽片免费看久久| 亚洲色图13p| 欧美午夜xxx| 亚洲精品免费一区二区三区| 欧美性猛交xxxx乱大交极品| 日韩精品欧美激情| 亚洲综合色av| 正在播放国产一区| 77777亚洲午夜久久多人| 亚洲欧美综合另类中字| 国产精品爱久久久久久久| 国产一区二区三区在线观看视频| 欧美成人全部免费| 国产成人亚洲综合91| 青草青草久热精品视频在线网站| 久久成人一区二区| 亚洲xxxxx电影| 性色av一区二区咪爱|