Hello Flask

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 http://127.0.0.1:8000/ (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()函数的参数为视图函数名,也可以在路由的装饰器中指定endpoint参数设置别名
例如


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

还可以通过类的方式进行配置

app.config.from_object("settings.DebugConfig")

在同级目录建立settings.py

class DebugConfig(Config):
DEBUG = True

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

debug模式

如运行时控制台的输出

  • Debug mode: off

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

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


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

此时我们故意使程序出错,即将视图函数多添加一个参数,再次访问url,会出现

这个页面对于我们调试错误非常有用,同时还允许我们在页面上执行Python代码,我们只需要点击错误最右边的命令行图标
这时会弹出一个窗口让我们输入PIN码,这个可以在程序刚允许时控制台输出找到

输入后就可在页面执行代码了

Hello Flask的更多相关文章

  1. flask+sqlite3+echarts2+ajax数据可视化

    前提: 准备Python + Flask+Sqlite3的平台环境(windows系统) 前面一节介绍flask怎么安装了,剩下sqlite3下载后解压,然后环境变量添加解压路径就行了 附加下载地址: ...

  2. flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法

    flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...

  3. Windows下快速安装Flask的一次经历

    前提: 1.已安装python版本(一般都是2.X) 2.已安装easy_install python安装,记得配置Python的环境变量,例如:我的直接在Path上加 G:\Python 验证安装P ...

  4. 使用Flask设计带认证token的RESTful API接口[翻译]

    上一篇文章, 使用python的Flask实现一个RESTful API服务器端  简单地演示了Flask实的现的api服务器,里面提到了因为无状态的原则,没有session cookies,如果访问 ...

  5. 使用python的Flask实现一个RESTful API服务器端[翻译]

    最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...

  6. python flask (一)

    from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World ...

  7. flask源码分析

    本flask源码分析不间断更新 而且我分析的源码全是我个人觉得是很beautiful的 1 flask-login 1.1 flask.ext.login.login_required(func),下 ...

  8. Python flask 基于 Flask 提供 RESTful Web 服务

    转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...

  9. Python flask @app.route

    转载自 http://python.jobbole.com/80956/ 下面是Flask主页给我们的第一个例子,我们现在就由它入手,深入理解“@app.route()”是如何工作的.         ...

  10. Flask 框架入门

    Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 安装 Flask 依赖两个外部库, We ...

随机推荐

  1. springboot情操陶冶-@Conditional和@AutoConfigureAfter注解解析

    承接前文springboot情操陶冶-@Configuration注解解析,本文将在前文的基础上阐述@AutoConfigureAfter和@Conditional注解的作用与解析 1.@Condit ...

  2. 巨杉数据库 MySQL兼容项目正式开源

    9月7日.8日,2018  ODF 开源数据库论坛,在北京盛大开幕.在大会上,巨杉数据库正式发布了巨杉全新的MySQL/MariaDB兼容架构,并将项目正式开源. 开源数据库论坛(ODF)是中国开源数 ...

  3. flex属性

    一.flex属性的归纳 flex-direction flex-wrap flex-flow justify-content align-items align-content 1.1 flex-di ...

  4. 判断本机ip是电信还是网通

    string location = "0";//0是网通 1是电信 Uri uri = new Uri("http://www.ip138.com/ips138.asp& ...

  5. C# 插件热插拔

    所谓热插拔就是插件可以 在主程序不重新启动的情况直接更新插件, 网上有很多方案: https://www.cnblogs.com/happyframework/p/3405811.html 如下: 但 ...

  6. C# winform程序怎么打包成安装项目(VS2010图解)

    作为研发人员,在本机上开发的winform.wpf或者控制台程序需要发给其他人测试时候,一般需要对其进行打包生成setup安装文件,根据网上查找的资料并结合自己打包成功,记录如下: 注:本程序是一个利 ...

  7. webpack 笔记

    webpack.config.json entry:入口,可有多个 devtool:'inline-source-map'      source map,遇到错误时,追踪到原文件,而不是编译后的文件 ...

  8. (5)Microsoft office Word 2013版本操作入门_标尺

    1.标尺 :左缩进,右缩进,悬挂缩进,首行缩进,阴影部分 可以左右拖拽调整边缘. 1.1  左缩进:默认缩进所在的段落,要缩进多段则需要多段落选中, 后拖动左缩进. 1.2 首行缩进缩进或者突出所选的 ...

  9. C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】

    一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简 ...

  10. JVM内存区域划分Eden Space,Survivor Space,Tenured Gen,Perm Gen

    jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...