欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Hello Flask

程序员文章站 2024-01-27 08:32:58
Hello Flask Flask简介 Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授权。Flask被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Fla ......

hello flask

flask简介

Hello Flask
flask是一个使用python编写的轻量级web应用框架。基于werkzeug wsgi工具箱和jinja2 模板引擎。flask使用bsd授权。
flask被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。flask没有默认使用的数据库、窗体验证工具。然而,flask保留了扩增的弹性,可以用flask-extension加入这些功能:orm、窗体验证工具、文件上传、各种开放式身份验证技术。
flask英文翻译为瓶子,烧瓶,与另一个web框架bottle同义,意在表示另一种容器,另一个框架。而且他们两个也有一些相似的地方。

第一个flask程序

from flask import flask
app = flask(__name__)

@app.route('/')
def index():
    return '<h1>hello,flask<h1/>'
app.run('127.0.0.1',8000)

运行后可见控制台输出:

  • serving flask app “hello” (lazy loading)
    • environment: production
      warning: do not use the development server in a production environment.
      use a production wsgi server instead.
    • debug mode: off
    • running on (press ctrl+c to quit)

url路由

flask路由采用装饰器的方式

@app.route('/')
  def index():

绑定多个路由

@app.route('/index')
@app.route('/')
def index():

动态路由

@app.route('/index/<name>')
def index(name):

name会作为参数传入视图函数
也可以为参数设置默认值:

@app.route('/index',defaults={'name':'sfencs'})
@app.route('/index/<name>')
def index(name):

它其实相当于

@app.route('/index')
@app.route('/index/<name>')
def index(name='sfencs'):

还可以指定参数的类型:

@app.route('/index/<int:num>')
def index(num):

这样路由只会匹配index后是数值类型参数的url,并且还会把num转换为int型
除了int之外还有path,string,float,any,uuid等

指定请求方式的路由

@app.route('/index/<int:num>',methods=['get'])
def index(num):

method参数是一个列表

使用url_for()获取url

当视图函数绑定的路由发送改变时,我们可能在其他使用该路径的地方一个一个手动修改,这种硬编码的方式降低了代码的易用性,这种情况可以使用url_for()函数来获取url
url_for()函数的参数为视图函数名
例如

@app.route('/index')
def aaa():

那么url_for(’aaa‘)就是’/index’
当然如果是有参数的路由,那么需要在url_for()函数中传入参数
例如

@app.route('/index/<int:num>')
def aaa(num):

url_for函数就应该写为:url_for(‘aaa’,num=123)
url_for()函数默认生成的是相对url,要想生成绝对url需要加入参数_external=true

http请求与响应

请求

如何在视图函数中获取请求,首先需要引入request对象

from flask import flask,request

在视图函数中可以直接通过request获得属性或方法
举个简单的例子

@app.route('/index/<int:num>',methods=['get'])
def index(num):
    print(request.method)
    print(request.args.get('name','sfencs'))
    return '<h1>hello,flask<h1/>'

request中的方法和属性未来都会对我们很有用,这里就不一一介绍了。

响应

1.普通响应
return '<h1>hello,flask<h1/>'

return '<h1>hello,flask<h1/>',200  #可以设置状态码
2.重定向
return redirect(url_for('index'))
3.错误响应
abort(404)

abort()函数直接返回错误响应,后面的代码不再执行

4.返回响应对象
response = make_response('<h1>hello,flask<h1/>')
response.mimetype = 'text/html'
return response

通过设置mimetype可以返回不同类型的数据,常用的有纯文本,html,xml,json
返回json格式数据时flask提供一种更简洁的方式

return jsonify({'name':'sfencs'})

这一个东西把生成response对象,设置数据类型,json序列化都做完了。

请求钩子

请求钩子是在视图函数处理请求的前或者后的阶段进行的处理函数
flask默认实现的五种请求钩子:

  • before_first_request 处理第一个请求之前
  • before_request 处理请求之前
  • after_request 处理请求之后
  • after_this_request 在视图函数内注册一个函数,会在这个请求结束后运行
  • teardown_request 在请求结束后,如果有异常也会执行的钩子,它在所有钩子中最后一个执行,需要传入异常对象

钩子通过装饰器注册,比如

@app.before_request
def func():
  pass

after_request和after_this_request的钩子必须接受一个响应类对象做参数,最后并将其返回

配置变量

flask中,配置变量通过flask对象的config属性配置与获取
在flask对象的源码中看到config中已经存储了很多默认值

default_config = immutabledict({
    'env':                                  none,
    'debug':                                none,
    'testing':                              false,
    'propagate_exceptions':                 none,
    'preserve_context_on_exception':        none,
    'secret_key':                           none,
    'permanent_session_lifetime':           timedelta(days=31),
    'use_x_sendfile':                       false,
    'server_name':                          none,
    'application_root':                     '/',
    'session_cookie_name':                  'session',
    'session_cookie_domain':                none,
    'session_cookie_path':                  none,
    'session_cookie_httponly':              true,
    'session_cookie_secure':                false,
    'session_cookie_samesite':              none,
    'session_refresh_each_request':         true,
    'max_content_length':                   none,
    'send_file_max_age_default':            timedelta(hours=12),
    'trap_bad_request_errors':              none,
    'trap_http_exceptions':                 false,
    'explain_template_loading':             false,
    'preferred_url_scheme':                 'http',
    'json_as_ascii':                        true,
    'json_sort_keys':                       true,
    'jsonify_prettyprint_regular':          false,
    'jsonify_mimetype':                     'application/json',
    'templates_auto_reload':                none,
    'max_cookie_size': 4093,
})

它其实是字典的子类,所以我们可以以字典的方式操作它

app.config['switch'] = 'on'
print(app.config['switch'])

也可以使用update方法一次添加多个配置

app.config.update(switch_a=true,switch_b=false)

最后要注意配置变量的名称必须要大写,小写的变量不会被读取

debug模式

如运行时控制台的输出

  • debug mode: off

可知默认debug模式是关闭的,所以当访问路径的程序出现错误的时候页面会显示
Hello Flask

若要开启debug模式,可在run方法添加debug=true参数

app.run('127.0.0.1',8000,debug=true)

此时我们故意使程序出错,即将视图函数多添加一个参数,再次访问url,会出现
Hello Flask
这个页面对于我们调试错误非常有用,同时还允许我们在页面上执行python代码,我们只需要点击错误最右边的命令行图标
这时会弹出一个窗口让我们输入pin码,这个可以在程序刚允许时控制台输出找到
Hello Flask
输入后就可在页面执行代码了
Hello Flask