flask 知识点总结


============================
request对象的常用属性
============================
具体使用方法如下:
request.headers, request.headers.get('If-None-Match')
request.json, request.json['value'] 或 request.json.get('detail_msg', "")
request.args, request.args.get('limit', 10)来获取query parameters
request.form, request.form['username'], 来获取POST/PUT request的form attribute
request.cookies, request.cookies.get('username') 另,response.set_cookie('username', 'the username')
request.method
request.request.path
flash(), 写flash字符串, 模板中可以使用get_flashed_messages()拿到写入的字符串.
   flash() 可以加上catergory参数, 对应的get_flashed_messages()加上category_filter来获取不同的flash字符串.

 
form 元素值的获取示例:
<input name="my_date" type="date" class="form-control" placeholder="date (like 20141231)" required autofocus>

form上元素比如input, 必须设置name属性, 在view python中, request.form['my_date']获取input的值, 这里的my_date是input元素的name, 而不是id属性.
另外,推荐使用 my_date=request.form.get('my_date',''),  而不是直接用my_date=request.form['my_date'], 后者一直取不到值, 直接跑出python 异常.  


   

============================   
request、g 和 session 对象
============================
flask的 flask._app_ctx_stack  和 request、 g、 session 都是 context 对象, 而且都是stack, 都是建在 Werkzeug 的 Thread Local 对象之上的, 可以用threading.local()来理解这样的对象, 针对每个web请求, server端即有一个线程对应, 因为是 thread local 架构, 即保证了线程安全. 这种实现的好处非常明显, 在所有的函数内部, 都可以直接使用这些全局对象, 也可以使用这些对象在不同函数之间传递数据.


应用上下文flask._app_ctx_stack 和 flask.g 差不多, 可以在这两个对象内部保存一些特定的数据, 当然这些数据只在"一个请求"的生命周期中有效. 不过flask._app_ctx_stack 推荐给extension的开发者使用, flask.g 留给web 开发使用. 如果要"跨请求"来共享数据, 需要使用 session 对象.  


在模板内部, 可以使用config, request、g 和 session 对象, 以及 get_flashed_messages()和url_for() 函数。
在视图函数中, 可以使用request、g 和 session 对象
 

 
============================   
视图函数返回值
============================
flask视图函数返回值, 原则上应该是一个response对象, 但也允许有其他类型的返回值, flask会自动将这些类型转成 response 对象, 转换的规则是:
1. 如果返回的是一个response对象, (我们可使用 make_response() 生成 response 对象), 那么flask直接返回它
2. 如果返回的是一个字符串, 将被转换为一个包含作为响应体的字符串、一个 "200 OK" 出错代码、一个 text/html MIME 类型的响应对象
3. 如果返回的是一个元组, 元祖的格式应该是(response,)或 (response, status), 或 (response, headers) 或 (response, status, headers) 形式.  flask 将会自动将status和headers更新到最终的response中.
4。如果以上都不是, 那么 Flask 会假定返回值是一个有效的 WSGI application, 并把它转换为一个响应对象, 比如一个json数据包即为一个有效的WSGI application.



-----------------------------
API视图常用的返回值为
-----------------------------
return jsonify({'item': check_itm_code, 'echo_msg': 'successful'}), 201

-----------------------------
网页视图函数常用的返回值为:
-----------------------------
return render_template('show_entries.html', entries=entries) #缺省status为200, OK
return render_template('page_not_found.html'), 404
return make_response(render_template('index.html', foo=42))



============================
session对象的使用
============================
session['logged_in'] = True #为session设置logged_in flag
session.pop('logged_in', None) #清空session中的logged_in flag



============================
cookies的使用
============================

读取 cookies:
from flask import request
@app.route('/')
def index():
    username = request.cookies.get('username')
    # 使用 cookies.get(key) 来代替 cookies[key] ,
    # 以避免当 cookie 不存在时引发 KeyError
    
储存 cookies:
from flask import make_response
@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp



    

============================
日志
============================
flask 已经为我们准备好了 logger 对象, app.logger 即为该logger对象, 和一般的console程序一样, 我们只需在web启动脚本中, 为root logger设置handler, 无需为flask logger专门再设置handler.  记log直接使用app.logger.info()等方法即可.  

如下代码, 记录出错log
@app.errorhandler(500)
def internal_error(exception): #这里exception是一个对象
    app.logger.exception(exception)
    return render_template('500.html'), 500
    

    

============================
Request的中断和ErrorHandler
============================    
在view函数中, 如果需要中断request, 可以使用abort(500)或者直接raise exception. 当然我们还需要显示一个出错页面给用户看. 所以需要定制一下ErrorHandler,  一般只需要2个handler即可, 一个是404错误, 一个是500一类的服务器端错误.
@app.errorhandler(404)
# 这个handler可以catch住所有的 abort(404) 以及找不到对应router的处理请求
def page_not_found(error):
    target = request.path + "?" + request.query_string
    app.logger.error("404 error for link: "+target)
    # app.logger.exception(error)
    return render_template('404.html', link=target), 404


@app.errorhandler(Exception)
# 这个handler可以catch住所有的 abort(500) 和 raise exeception.
# traceback.html 页面取自 airflow 项目
def show_traceback(error):
    return render_template(
        'traceback.html',
        hostname=socket.gethostname(),
        nukular=ascii_.nukular,
        info=traceback.format_exc()), 500

 
    
    
============================
blueprint
============================    
blueprint视图函数和普通视图函数一样, 可以使用flask.g, flask.request, flask.session, 但使用application级别的对象(比如config和logger),不能直接用app.logger, 必须通过current_app对象, 比如 current_app.logger, current_app.config,  subject=current_app.config['MAIL_SUBJECT']   
 
另外, blueprint 也可以有 before_request, teardown_request, errorhandler 装饰器, 但我觉得一般不必增加blueprint级别装饰函数, 直接共用app的对等函数即可, 除非一定非要将blueprint做成纯粹的 plug&play.

url_for('blueprint123.index')

 

 

 
Blueprint 是组织module的一个很好的方式, 通常我们会为不同的 Blueprint 设置不同的url prefix.
在设置了url prefix后, html 模板中与这个blueprint相关的link 字符串, 都需要加上url prefix, 否则路由地址就不对了.

当然这样的写法其实很是很糟糕的, hard code 的url prefix一多, 哪一天要调整这个url prefix就麻烦了.

最好的作法, 当然不是到处hard code 链接地址了, 推荐使用url_for()函数.  
但加了url prefix之后, 使用 url_for() 函数时, 需要为view函数加一个命名空间, 到底这个命名空间取什么,  结论是 Blueprint的名称, 不是Blueprint对象的名称, 也不是python 模块的名称. 这是我花了很长时间才试验出来, 见下面的示例:


#views.py
mod = Blueprint('myReport', __name__, url_prefix='/reports')  #Blueprint的名称是 myReport


@mod.route("/csv_data/<report_name>/<time_id>")
def download_csv_view(report_name, time_id):
    return 'a,b,c,d,e'

    
def redirect_sample():
    return redirect(url_for('myReport.download_csv', report_name='report_1', time_id='201406' ))
    
 
模板上的写法也是一样,   
 <a href="{{ url_for('myReport.download_csv', report_name='report_1', time_id='201406')}}">
    download csv of report_1(201406)  
</a>

 

 

 

============================
flask 内建的renderer,
============================    
mine_types{'json_renderer':('application/json',),
           'xml_renderer':('application/xml','text/xml','application/x-xml',)
          }
          
除了内建的json和xml两个renderer外, 使用 flask-mimerender 扩展, 可以很容易增加其他的renderer, 比如excel和csv输出.
 

 
============================    
关闭模板中的转义
============================   
方法1, 在Python文件中进行转义, 先在 Markup 对象中进行转义,然后将它传送给模版。一般推荐使用这个方式。
from flask import Markup
result=Markup(result(params))
return render_template('xxx.html', result=result)

方法2, 在模版文件中进行转义. 通过 |safe 过滤器来表示字符串是安全的({{result|safe}})
渲染的时候 {{ result|safe }}

方法3, 暂时禁用全局的自动转义功能。
{% autoescaping false %}
<p>autoescaping is disableed here
<p>{{ will_not_be_escaped }}
{% endautoescape %}

 
 

知识点:
1. API 的url最好包含/api/v1.0 这样的字符串, 加上版本号, 有利于版本控制.
2. api函数的app.route装饰器, methods参数要么缺省, 要么POST/GET都要加, 如果只加一个, request会报HTTP Error 405, METHOD NOT ALLOWED
3. api函数返回类型最好都是json格式, 推荐使用flask的jsonify()作为返回值, 它可以将dict转成json
4. api的消费端, 发起POST请求, 可使用标准库urllib2.Request()方法, 需要指定data和headers参数, 这样才是POST.
如, urllib2.Request(url, data=data_json, headers={'Content-Type': 'application/json'})
5. api的消费端, 发起POST请求, 往往需要传json数据进去, 可使用json库的json.dumps()将dict转成json.
6. api的消费端得到的response, 其类型是str, 可使用json库的json.loads() 转成json格式



@app.route('/user/<username>')
@app.route('/user/<converter:variable_name> ')
flask内建的converter可以有:
@app.route('/user/<int:user_id> ')
@app.route('/user/<float:salary> ')
@app.route('/user/<path:full_dept> ')

如果有one和two都是可选参数, 就不能使用myapp/api/getDetails/<one>/<two>形式的url了, 推荐使用?和kv结合的形式.
比如: http://localhost:5003/myapp/api/getDetails?one=abc&two=123&three=xxx

@mod.route("/myapp/api/getDetails", methods=('GET', 'POST'))             
def getPrStatusDetail():
    one=request.args.get('one', '')
    two=request.args.get('two', '')
    three=request.args.get('three', '')
    grid_data=SomeObject.getDetail(one,two,three)
    return JsonConverter.ObjListToJson(grid_data),201  



API 模块
@mod.route("/api/v1.0/test/simple", methods=('POST','GET'))

def test_simple_view():
    return jsonify({'request.method': request.method, 'echo_msg': 'successful' } ), 201   


测试代码    
#request for test/simple, method is GET
import json
import urllib2
url = "http://localhost:5000/api/v1.0/test/simple"
req = urllib2.Request(url)
f = urllib2.urlopen(req)
httpCodes=f.getcode()
responseStr = f.read()
f.close()
json_data=json.loads(responseStr)
echo_msg=json_data['echo_msg']




--------------------------------------------------------
API 模块
url有一个动态参数, 没有指定类型, 则表示为str型
@mod.route("/api/v1.0/test/str_arg/<check_itm_code>", methods=('POST','GET'))
def test_str_argument_view(check_itm_code):
    return jsonify({'request.method': request.method,'item': check_itm_code, 'echo_msg': 'successful'}), 201
    
    
测试代码  
#request for test/str_arg/<check_itm_code>, method is GET
import json
import urllib2
url = "http://localhost:5000/api/v1.0/test/str_arg/abc"
req = urllib2.Request(url)
f = urllib2.urlopen(req)
httpCodes=f.getcode()
responseStr = f.read()
f.close()
json_data=json.loads(responseStr)
echo_msg=json_data['echo_msg']





--------------------------------------------------------
API 模块
url有一个动态参数, 指定为int型, 还可以指定成float型
@mod.route("/api/v1.0/test/int_arg/<int:seq_no>", methods=('POST','GET'))
def test_int_argument_view(seq_no):
    return jsonify({'request.method': request.method,'seq_no': seq_no, 'echo_msg': 'successful'}), 201  
    
    
测试代码     
#request for test/int_arg/<int:seq_no>, method is GET
import json
import urllib2
url = "http://localhost:5000/api/v1.0/test/int_arg/123"
req = urllib2.Request(url)
f = urllib2.urlopen(req)
httpCodes=f.getcode()
responseStr = f.read()
f.close()
json_data=json.loads(responseStr)
echo_msg=json_data['echo_msg']


 


除了str/int/float这样常用的url参数, 还支持regex, 比如app.route('/regex("[\w]*[Ss]"):collection')


--------------------------------------------------------
API 模块
接受request 包含json格式的数据
@mod.route("/api/v1.0/test/json_post/<check_itm_code>", methods=('POST','GET'))
def test_json_post_view(check_itm_code):
    if not request.json:
        abort(400)  # bad request    
        
    if not 'value' in request.json:
            abort(400)  # bad request    
                 
    value=request.json['value']     
    detail_msg=request.json.get('detail_msg', "")  # if detail_msg is not set, use empty  
    return jsonify({'request.method': request.method,'value': value,'detail_msg':detail_msg, 'echo_msg': 'successful'}), 201    
            
            
    
测试代码
#request for test/json_post/<check_itm_code>, method is POST
#需要在urllib2.Request()中指定data和headers参数, 这样才是POST
import json
import urllib2
data = {'value': '100',
        'detail_msg': 'SOMETHING HERE'
}
data_json = json.dumps(data)
url = "http://localhost:5000/api/v1.0/test/json_post/hang_check"
req = urllib2.Request(url, data=data_json, headers={'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
httpCodes=f.getcode()
responseStr = f.read()
f.close()
json_data=json.loads(responseStr)
echo_msg=json_data['echo_msg']

 


 

=====================================================
WTF 相关
=====================================================

WTF 常用的 field 类型
'BooleanField', 'TextAreaField', 'PasswordField', 'FileField',
'HiddenField', 'SubmitField', 'TextField'


常用的验证方式有:
'DataRequired', 'data_required', 'Email', 'email', 'EqualTo', 'equal_to',
'IPAddress', 'ip_address', 'InputRequired', 'input_required', 'Length',
'length', 'NumberRange', 'number_range', 'Optional', 'optional',
'Required', 'required', 'Regexp', 'regexp', 'URL', 'url', 'AnyOf',
'any_of', 'NoneOf', 'none_of', 'MacAddress', 'mac_address', 'UUID'


=====================================================
jinja2 相关
=====================================================

使用 {# ... #}注释代码
使用 {% set var='' %} 进行赋值,  {% set key, value = call_something() %}
使用 {{…}} 调用变量
使用 {% if … %},{% elif otherthing %} ,{% else %},{% endif %} 控制流程
使用 {% for … in … %},{% endfor %} 定义循环
使用 {% block …%},{% endblock %} 定义继承内容块
使用 {% extends “FILENAME” %},{% block …%},{% endblock %} 引入模版继承的内容

转载于:https://www.cnblogs.com/harrychinese/p/flask_tips.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postgresql中的hybrid hash join(无状态机讲解)

hybrid hash join hybrid hash join是基于grace hash join 的优化。 在postgresql中的grace hash join 是这样做的&#xff1a;inner table太大不能一次性全部放到内存中&#xff0c;pg会把inner table 和outer table按照join的key分成多个分区&#xff0c;每个分区(有一个inn…

末日中的黎明

哈哈&#xff0c; 今天是2012-12-21&#xff0c;传说中的世界末日&#xff0c;不过现在看来&#xff0c;一切都是空的。。。 在这个容易记忆的日子里&#xff0c;我的博客开通了。他将伴随我以后的学习开发&#xff0c;期望我能充分利用博客&#xff0c;帮我养成常总结、常记笔…

使用numpy.tanh()打印矢量/矩阵元素的双曲正切值 使用Python的线性代数

Prerequisite: 先决条件&#xff1a; Defining a Vector 定义向量 Defining a Matrix 定义矩阵 Numpy is the library of function that helps to construct or manipulate matrices and vectors. The function numpy.tanh(x) is a function used for generating a matrix / v…

Mahout kmeans聚类

Mahout K-means聚类 一、Kmeans 聚类原理 K-means算法是最为经典的基于划分的聚类方法&#xff0c;是十大经典数据挖掘算法之一。K-means算法的基本思想是&#xff1a;以空间中k个点为中心进行聚类&#xff0c;对最靠近他们的对象归类。通过迭代的方法&#xff0c;逐次更新各聚…

Web项目中获取SpringBean——在非Spring组件中获取SpringBean

最近在做项目的时候我发现一个问题&#xff1a;Spring的IOC容器不能在Web中被引用(或者说不能被任意地引用)。我们在配置文件中让Spring自动装配&#xff0c;但并没有留住ApplicationContext的实例。我们如果希望在我们的项目中任何位置都能拿到同一个ApplicationContext来获取…

postgresql对于HashJoin算法的Data skew优化与MCV处理

Data skew 很好理解&#xff0c;即数据倾斜。现实中的数据很多都不是正态分布的&#xff0c;譬如城市人口&#xff0c;东部沿海一个市的人口与西部地区一个市地区的人口相比&#xff0c;东部城市人口会多好几倍。 postgresql的skew的优化核心思想是"避免磁盘IO"。 优…

JavaScript | 创建对象并通过JavaScript函数在表中显示其内容

In this example, we created an object named employee with id, name, gender, city, and salary and assigned and displaying the values in the table using JavaScript function. 在此示例中&#xff0c;我们创建了一个名为employee的对象&#xff0c;其对象为id &#x…

基于socket的简单文件传输系统

【实验目的及要求】 在 Uinx/Linux/Windows 环境下通过 socket 方式实现一个基于 Client/Server 文件传输程序。 【实验原理和步骤】 1. 确定传输模式:通过 socket 方式实现一个基于 Client/Server 或 P2P 模式的文件传输程序。 2. 如果选择的是 Client/Server 模式的文件传输…

《GPU高性能编程-CUDA实战》中例子头文件使用

《GPU高性能编程-CUDA实战&#xff08;CUDA By Example&#xff09;》中例子中使用的一些头文件是CUDA中和C中本身没有的&#xff0c;需要先下载这本书的源码&#xff0c;可以在&#xff1a;https://developer.nvidia.com/content/cuda-example-introduction-general-purpose-g…

mcq 队列_人工智能| AI解决问题| 才能问题解答(MCQ)| 套装1

mcq 队列1) Which of the following definitions correctly defines the State-space in an AI system? A state space can be defined as the collection of all the problem statesA state space is a state which exists in environment which is in outer spaceA state sp…

Postgresql的HashJoin状态机流程图整理

状态机 可以放大观看。 HashJoinState Hash Join运行期状态结构体 typedef struct HashJoinState {JoinState js; /* 基类;its first field is NodeTag */ExprState *hashclauses;//hash连接条件List *hj_OuterHashKeys; /* 外表条件链表;list of …

Ajax和Jsonp实践

之前一直使用jQuery的ajax方法&#xff0c;导致自己对浏览器原生的XMLHttpRequest对象不是很熟悉&#xff0c;于是决定自己写下&#xff0c;以下是个人写的deom&#xff0c;发表一下&#xff0c;聊表纪念。 Ajax 和 jsonp 的javascript 实现&#xff1a; /*! * ajax.js * …

得到前i-1个数中比A[i]小的最大值,使用set,然后二分查找

题目 有一个长度为 n 的序列 A&#xff0c;A[i] 表示序列中第 i 个数(1<i<n)。她定义序列中第 i 个数的 prev[i] 值 为前 i-1 个数中比 A[i] 小的最大的值&#xff0c;即满足 1<j<i 且 A[j]<A[i] 中最大的 A[j]&#xff0c;若不存在这样的数&#xff0c;则 pre…

学习语言贵在坚持

学习语言贵在坚持 转自&#xff1a;http://zhidao.baidu.com/link?urlr2W_TfnRwipvCDLrhZkATQxdrfghXFpZhkLxqH1oUapLOr8jXW4tScbyOKRLEPVGCx0dUfIr-30n9XV75pWYfK给大家介绍几本书和别处COPY来的学习C50个观点 《Thinking In C》&#xff1a;《C编程思想》&#xff1b; 《The…

stl vector 函数_在C ++ STL中使用vector :: begin()和vector :: end()函数打印矢量的所有元素...

stl vector 函数打印向量的所有元素 (Printing all elements of a vector) To print all elements of a vector, we can use two functions 1) vector::begin() and vector::end() functions. 要打印矢量的所有元素&#xff0c;我们可以使用两个函数&#xff1a;1) vector :: b…

JqueryUI入门

Jquery UI 是一套开源免费的、基于Jquery的插件&#xff0c;在这里记录下Jquery UI 的初步使用。 第一、下载安装 下载Jquery,官网&#xff1a;http://jquery.com;  下载Jquery UI&#xff0c;官网&#xff1a;http://jqueryui.com/ Jquery的部署就不说了&#xff0c;说下Jqu…

gp的分布、分区策略(概述)

对于大规模并行处理数据库来说&#xff0c;一般由单master与多segment组成。 那么数据表的单行会被分配到一个或多个segment上&#xff0c;此时需要想一想分布策略 分布 在gp6中&#xff0c;共有三个策略&#xff1a; 哈希分布 随机分布 复制分布 哈希分布 就是对分布键进行…

[ Java4Android ] Java基本概念

视频来自&#xff1a;http://www.marschen.com/ 1.什么是环境变量 2.JDK里面有些什么&#xff1f; 3.什么是JRE&#xff1f; 什么是环境变量&#xff1f; 1.环境变量通常是指在操作系统当中&#xff0c;用来指定操作系统运行时需要的一些参数; 2.环境变量通常为一系列的键值对&…

_thread_in_vm_Java Thread类的静态void sleep(long time_in_ms,int time_in_ns)方法,带示例

_thread_in_vm线程类静态无效睡眠(long time_in_ms&#xff0c;int time_in_ns) (Thread Class static void sleep(long time_in_ms, int time_in_ns)) This method is available in package java.lang.Thread.sleep(long time_in_ms, int time_in_ns). 软件包java.lang.Thread…

大规模web服务开发技术(转)

前段时间趁空把《大规模web服务开发技术》这本书看完了&#xff0c;今天用一下午时间重新翻了一遍&#xff0c;把其中的要点记了下来&#xff0c;权当复习和备忘。由于自己对数据压缩、全文检索等还算比较熟&#xff0c;所以笔记内容主要涉及前5章内容&#xff0c;后面的零星记…