Flask 使用小结【Updating】

阅读:454 2019-03-19 14:40:15 来源:开源中国

#!/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//')defquery(qid):pass

一般可以处理数据库连接等等

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())

接收f=request.files.get('upload')img_data=f.read()

直接返回某个文件

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='''flaskpost方法演示{}
'''ifrequest.method=='get':returnhtml.format('')elifrequest.method=='post':ifrequest.form['username']:urllist=request.form['username'].splitlines()resultstr=""forurlinurllist:resultstr+=chklistpagecontent(url,geturlcontent(url),"script")+"
"returnhtml.format('

检查结果
{}

'.format(resultstr))else:returnredirect(url_for('username'))if__name__=='__main__':app.run(debug=true,host='127.0.0.1',port=8080)

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%}{%endfor%}page_ids=request.form.getlist("do_delete")

#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

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服