{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
#!/usr/bin/envpython#encoding:utf-8fromflaskimportflaskapp=flask(__name__)@app.route('/')defindex():return'helloworld'if__name__=='__main__':app.run(debug=true)#app.run(host='127.0.0.1',port=8000)
之后,访问http://localhost:5000
@app.route('/',methods=['get','post'])
多个url指向
@app.route('/')
@app.route('/index')
不管post/get使用统一的接收
fromflaskimportrequestargs=request.argsifrequest.method=='get'elserequest.forma=args.get('a','default')
@app.route('/query/
一般可以处理数据库连接等等
fromflaskimportgapp=.....@app.before_requestdefbefore_request():g.session=create_session()@app.teardown_requestdefteardown_request(exception):g.session.close()
注册jinja2模板中使用的过滤器
@app.template_filter('reverse')defreverse_filter(s):returns[::-1]
或者
defreverse_filter(s):returns[::-1]app.jinja_env.filters['reverse']=reverse_filter
可以这么用
defa():...defb():...fil={'a':a,'b':b}app.jinja_env.filters.update(fil)
注册jinja2模板中使用的全局变量
jinja2_globals={'media_prefix':'/media/'}app.jinja_env.globals.update(jinja2_globals)
app=flask(__name__,template_folder=settings.template_folder,static_folder=settings.static_path)使用blueprintfromflaskimportblueprintbp_test=blueprint('test',__name__)#bp_test=blueprint('test',__name__,url_prefix='/abc')@bp_test.route('/')--------fromxxximportbp_testapp=flask(__name__)app.register_blueprint(bp_test)
包装cookie实现的,没有sessionid
app.secret_key='ps#yio`%_!((f_or(%)))s'然后fromflaskimportsessionsession['somekey']=1session.pop('logged_in',none)session.clear()#过期时间,通过cookie实现的fromdatetimeimporttimedeltasession.permanent=trueapp.permanent_session_lifetime=timedelta(minutes=5)
fromflaskimporturl_for,render_template@app.route("/")defhome():login_uri=url_for("login",next=url_for("home"))returnrender_template("home.html",**locals())
直接返回某个文件
returnsend_file(settings.template_folder+'tweet/tweet_list.html')
文档:http://flask.pocoo.org/docs/api/#flask.redirect
@app.route('/')defhello():returnredirect(url_for('foo'))@app.route('/foo')deffoo():return'hellofoo!'fromflaskimportabort@app.route('/*')defpage404():abort(404)@app.errorhandler(404)defpage_not_found(e):printrequest.url+"t404..."returnrender_template('page404.html'),404
获取用户真实ip
从request.headers获取real_ip=request.headers.get('x-real-ip',request.remote_addr)或者,使用werkzeug的middleware文档fromwerkzeug.contrib.fixersimportproxyfixapp.wsgi_app=proxyfix(app.wsgi_app)
#!/usr/bin/envpython3#-*-coding:utf-8-*-importsysreload(sys)sys.setdefaultencoding('utf-8')fromcommonfuncimport*fromflaskimportflask,request,redirect,url_forapp=flask(__name__)@app.route('/')defindex():returnredirect(url_for('username'),code=302)#url跳转,默认代码是302,可以省略@app.route('/username',methods=['get','post'])defusername():html='''
检查结果
{}
request的header中"content-type":"application/json"处理时:data=request.get_json(silent=false)importjsonfromflaskimportjsonify,response,jsondata=[]#orothersreturnjsonify(ok=true,data=data)jsonp_callback=request.args.get('callback','')ifjsonp_callback:returnresponse("%s(%s);"%(jsonp_callback,json.dumps({'ok':true,'data':data})),mimetype="text/javascript")returnok_jsonify(data)
{%forpageinpages%}
#createourlittleapplication:)app=flask(__name__)#loaddefaultconfigandoverrideconfigfromanenvironmentvariableapp.config.update(dict(database='/tmp/flaskr.db',debug=true,secret_key='developmentkey',username='admin',password='default'))app.config.from_envvar('flaskr_settings',silent=true)------------------#configurationdatabase='/tmp/minitwit.db'per_page=30debug=truesecret_key='developmentkey'#createourlittleapplication:)app=flask(__name__)app.config.from_object(__name__)app.config.from_envvar('minitwit_settings',silent=true)
fromflaskimportabort,flashabortifnotsession.get('logged_in'):abort(401)flashflash('newentrywassuccessfullyposted')
flask中实现域名301重定向
当然,这是一种非常不明智的做法,只是一种临时性的手段。301重定向应该由服务器层面的应用程序(比如nginx,apache,iis等)来完成。代码示例如下:
defredirectmiddleware(request):url=nonedomain='www.digwtx.com'try:host,port=request.host.split(':')path=request.pathexcept:host=request.hostport=80path=request.pathifhost!=domain:print'do301'ifport==80:url='http://%s%s'%(domain,path)else:url='http://%s:%s%s'%(domain,port,path)returnurl
想在flask的一个请求中处理异步,除了使用消息系统,可以用简单的线程处理
fromthreadingimportthreaddefasync(f):defwrapper(*args,**kwargs):thr=thread(target=f,args=args,kwargs=kwargs)thr.start()returnwrapper@asyncdefdosomething(call_args):printcall_argsinarequesthandler,call`dosomething`
1.直接app.config['host']='xxx.a.com'printapp.config.get('host')2.环境变量exportmyappconfig=/path/to/settings.cfgapp.config.from_envvar('myappconfig')3.对象classconfig(object):debug=falsetesting=falsedatabase_uri='sqlite://:memory:'classproductionconfig(config):database_uri='mysql://user@localhost/foo'app.config.from_object(productionconfig)printapp.config.get('database_uri')#mysql://user@localhost/foo4.文件#default_config.pyhost='localhost'port=5000debug=trueapp.config.from_pyfile('default_config.py')
fromflaskimportflask,gdefcreate_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_requestdefbefore_request():g.xxx=...#dosomething@app.teardown_requestdefteardown_request(exception):g.xxx=...#dosomethingreturnappapp=create_app(settings.debug)host=settings.server_ipport=settings.server_portapp.run(host=host,port=port)
threaded多线程支持,默认不开启processes进程数量,默认为1个
if__name__=='__main__':#app.run(host='localhost',port=8080,debug=true)app.run(host='localhost',port=8080,threaded=true,debug=true)app.run(processes=10)
如果使用了flask-script来部署应用,可以给runserver命令加上--threaded参数或者--processesn参数(参数意义同上)。例如:pythonmanage.pyrunserver--threaded或者:pythonmanage.pyrunserver--processes3
>>>importos>>>os.urandom(24)'xcax0cx86x04x98@x02bx1b7x8cx88]x1bxd7"+xe6px@xc3#\'然后:app=flask(__name__)app.config['secret_key']='xcax0cx86x04x98@x02bx1b7x8cx88]x1bxd7"+xe6px@xc3#\'#orapp.secret_key='xcax0cx86x04x98@x02bx1b7x8cx88]x1bxd7"+xe6px@xc3#\'#orapp.config.update(secret_key='xcax0cx86x04x98@x02bx1b7x8cx88]x1bxd7"+xe6px@xc3#\')
>>>fromwerkzeug.securityimportgenerate_password_hash>>>printgenerate_password_hash('123456')'pbkdf2:sha1:1000$x97hpa3g$252c0cca000c3674b8ef7a2b8ecd409695aac370'>>>fromwerkzeug.securityimportcheck_password_hash>>>pwhash='pbkdf2:sha1:1000$x97hpa3g$252c0cca000c3674b8ef7a2b8ecd409695aac370'>>>printcheck_password_hash(pwhash,'123456')true
1、flask使用小结http://wklken.me/posts/2013/09/09/python-framework-flask.html
2、flaskpost方法
http://www.itwhy.org/%e8%bd%af%e4%bb%b6%e5%b7%a5%e7%a8%8b/python/flask-post%e6%96%b9%e6%b3%95.html
3、day3:flask——使用python和openshift进行即时web开发
http://segmentfault.com/a/1190000000351512
4、flaskwebdevelopment——模板(中)
http://segmentfault.com/blog/young_ipython/1190000000755204
5、flask技巧
http://flask123.sinaapp.com/category/flask-tips/
6、python模板-jinja2