gpt4 book ai didi

Python的Flask开发框架简单上手笔记

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python的Flask开发框架简单上手笔记由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

最简单的hello world 。

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

之后,访问http://localhost:5000 。

支持post/get提交 。

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

多个url指向 。

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

不管post/get使用统一的接收 。

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

处理json请求 request的header中 。

?
1
"Content-Type" : "application/json"

处理时

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

获取post提交中的checkbox 。

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

使用url中的参数 。

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

在request开始结束dosomething 一般可以处理数据库连接等等 。

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

注册Jinja2模板中使用的过滤器 。

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

或者 。

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

可以这么用 。

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

注册Jinja2模板中使用的全局变量 。

?
1
2
JINJA2_GLOBALS = { 'MEDIA_PREFIX' : '/media/' }
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
2
3
4
5
6
7
8
9
10
11
from flask import Blueprint
bp_test = Blueprint( 'test' , __name__)
#bp_test = Blueprint('test', __name__, url_prefix='/abc')
 
@bp_test .route( '/' )
 
- - - - - - - -
from xxx import bp_test
 
app = Flask(__name__)
app.register_blueprint(bp_test)

实例

?
1
2
3
bp_video = Blueprint( 'video' , __name__, url_prefix = '/kw_news/video' )
@bp_video .route( '/search/category/' , methods = [ 'POST' , 'GET' ])
#注意这种情况下Blueprint中url_prefix不能以 '/' 结尾, 否则404

使用session 包装cookie实现的,没有session id 。

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

然后 。

?
1
2
3
4
5
6
7
8
9
10
11
from flask import session
 
session[ 'somekey' ] = 1
session.pop( 'logged_in' , None )
 
session.clear()
 
#过期时间,通过cookie实现的
from datetime import timedelta
session.permanent = True
app.permanent_session_lifetime = timedelta(minutes = 5 )

反向路由 。

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

上传文件 。

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

接收 。

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

直接返回某个文件 。

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

请求重定向 。

?
1
2
3
4
5
6
7
8
9
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.
 
@app .route( '/' )
def hello():
   return redirect(url_for( 'foo' ))
 
@app .route( '/foo' )
def foo():
   return 'Hello Foo!'

获取用户真实ip 从request.headers获取 。

real_ip = request.headers.get('X-Real-Ip', request.remote_addr) 或者, 使用werkzeug的middleware 文档 。

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

配置读取方法 。

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

几个不常用的方法 。

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

异步调用 想在flask的一个请求中处理异步, 除了使用消息系统, 可以用简单的线程处理 。

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

项目配置 1.直接 。

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

2.环境变量 。

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

3.对象 。

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

4.文件 。

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

EG. 一个create_app方法 。

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

  。

最后此篇关于Python的Flask开发框架简单上手笔记的文章就讲到这里了,如果你想了解更多关于Python的Flask开发框架简单上手笔记的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com