Flask——基础知识
Flask应用程序
一个简单的Flask应用程序
# 导入flask程序
from flask import Flask # 初始化flask对象
app = Flask(__name__)
# 装饰器模式,新建路由,绑定index视图函数
@app.route("/index")
def index():
return "index page" # 判断当前的__name__ 是否是__main__
# __name__ : 如果做为单一模块运行,表示主模块名称:__main__
# 如果做为模块导入,那么就表示当前模块的名字
if __name__ == '__main__':
# 启动app
app.run()
运行之后,在浏览器地址栏输入:http://127.0.0.1:5000/index
就可以看到视图函数返回的内容
Flask程序创建的参数
Flask程序创建(app = Flask(初始化参数)的时候其实有很多的参数,前面提到的例子中只写了:__name__。下面会详细说下创建的参数。
源码中的参数是:
这里我只介绍常用的
import_name
# 第⼀一个参数:指定当前应⽤用程序所处于的模块,其可以决定静态⽂文件从哪个位置开始查找,
# 在加载静态⽂文件时,会从第⼀一个参数指定的模块下开始查找,
# 如果模块不不存在,会从当前app所在模块的⽬目录下开始找'static'⽂文件夹
# 多数人在这个地方传入__name__。所以默认是__main__,因为不存在__main__模块,所以会从当前模块的同级目录查找static文件夹
static_url_path
静态文件访问路径
static_folder
静态文件所处文件夹
template_folder
模板文件所处文件夹
默认是:templates
程序运行时的参数
app.run("运行参数") 运行参数:
debug # 表示启用debug模式
host # 运行的地址
port # 绑定的端口
Flask项目加载配置
从对象中加载配置
from flask import Flask app = Flask(__name__) class Config(object):
# 开启调试模式
DEBUG = True # 设置debug开启,当出错会在网页中显示出来。
NAME = "name" # 设置一个自定义的变量 # 从对象当中加载
app.config.from_object(Config) @app.route("/")
def index():
# a = 1 / 0
print(app.config.get("NAME")) # 读取自定义的变量
return "index page" if __name__ == '__main__':
app.run()
从路径中加载配置
首先要在当前目录建一个文件,文件名和后缀可以任意取,但是本着见名知意的原则,我取名为了:config.cfg,在文件中我写入了:DEBUG = True
from flask import Flask app = Flask(__name__) app.config.from_pyfile("config.cfg") @app.route("/")
def index():
# a = 1 / 0
return "index page" if __name__ == '__main__':
app.run()
其他方法
app.config['DEBUG'] = True
app.DEBUG = True
app.run(debug = True)
返回状态码、抛出和捕捉异常
返回状态码
编码:
@app.route("/")
def index():
return "状态码", 666
效果
自定义相应头
编码:
@app.route("/")
def index():
return "状态码", 666, {"name": "zhangshan"}
效果:
抛出异常
编码:
# 导入包
from flask import abort
效果:
捕获异常
编码:
from flask import Flask, abort app = Flask(__name__) @app.errorhandler(404) # 除了404,这些状态码,也可以对指定的错误进行捕获和处理,比如zeroDivisionError
def demo2(e):
"""专⻔门捕获指定的状态码异常信息,然后处理理异常"""
print(e)
return '服务器器搬家了了' @app.route('/index')
def index():
abort(404) if __name__ == '__main__':
app.run()
效果:
Flask路由
请求方法
限定请求方法
@app.route(‘/‘, methods=[‘GET’, ‘POST’])
获取请求方法
首先要导入request模块,里面封装着用户请求
from flask import request
然后通过request.method可以获取请求方法。
其他通过request获取的
from flask import Flask
from flask import request app = Flask(__name__) @app.route("/index",methods=["GET","POST"])
def index():
# request : 封装的所有的请求信息
# request.form : 提取表单数据
name = request.form.get("name")
age = request.form.get("age")
# request.args :提取?后面的数据
city = request.args.get("city")
# request.data:提取的是原始数据(json)
print("request.data = %s" % request.data.decode())
return "name = %s,age = %s,city = %s" % (name, age, city) if __name__ == '__main__':
app.run()
默认请求方法
HEAD:获取相应头信息
GET:获取数据,全部信息
OPTIONS:查看某个url可以支持哪些请求方法。
url_map
url_map又可以称为路由视图关系映射,可以通过app.url_map查看。
当同一个路由映射两个视图,当发送请求时,路由会根据map表的顺序从上到下查找,会执行先定义的路由和视图
获取路由的参数
from flask import Flask app = Flask(__name__) @app.route('/index/<id>')
def index(id):
return "id: %s" % id if __name__ == '__main__':
app.run(debug=True)
重定向
首先引入模块:
from flask import redirect
重定向到指定网址
return redirect(‘http://www.baidu.com’))
重定向到指定视图
return redirect(url_for("index")) # url_for需要导包
重定向传参
return redirect(url_for("order", id=11))
from flask import Flask, redirect, url_for app = Flask(__name__) @app.route("/order/<id>")
def order(id):
return "id:%s" % id @app.route('/')
def demo():
return redirect(url_for("order", id=11)) # 相当于重定向到指定视图对应的url,而且路由中必须有和其匹配的,否则会报错 if __name__ == '__main__':
app.run()
自定义路由匹配转换器
首先导入模块
from werkzeug.routing import BaseConverter
下面是自带的转换器,Ctrl+鼠标左键点BaseConverter可以看到默认的转换器
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
实际中我们需要这个转换器帮我们做更多的筛选。所以需要自定义。
例子:
from flask import Flask
from werkzeug.routing import BaseConverter class RegexConverter(BaseConverter):
"""⾃自定义转换器器:实现最多传⼊入5个数字""" # 重写⽗父类的属性,定义转换器规则
regex = '[0-9]{5}' app = Flask(__name__) # 将自定义的转换器添加到转换器列表中
app.url_map.converters['re'] = RegexConverter @app.route('/order/<re:order_id>')
def demo1(order_id):
return 'demo1 %s' % order_id if __name__ == '__main__':
app.run()
上面例子中写的太死,下面是优化了的:
from flask import Flask
from werkzeug.routing import BaseConverter class RegexConverter(BaseConverter):
def __init__(self, url_map, *args): # 在启动服务器的时候flask就自动的将正则放入了args中了,等浏览器输入会放入url_map中
super(RegexConverter, self).__init__(url_map)
self.regex = args[0] app = Flask(__name__) # 将自定义的转换器添加到转换器列表中
app.url_map.converters['re'] = RegexConverter @app.route('/order/<re("[0-9]{5}"):order_id>')
def demo1(order_id):
return 'demo1 %s' % order_id if __name__ == '__main__':
app.run()
返回JSON
json模块
json_dict = {
‘name’:’zxc’,
‘age’:18
}
from flask import Flask, json
json_str = json.dumps(json_dict)
这个成json后,传浏览器的时候Content-Type还是text/html,还需要再修改,不建议
jsonify模块
json_dict = {
‘name’:’zxc’,
‘age’:18
}
from flask import Flask, jsonify
json_str = jsonify(json_dict)
这个转json后,浏览器传输的时候Content-Type变成了application/json。建议使用
请求对象属性
data:读取请求体中的原始字符串,比如json字符串
form:用户通过表单发给服务器的数据,比如POST表单数据到服务器
args:用户通过查询参数发给服务器的数据,也就是url中?后面的参数。比如:http://127.0.0.1/upload?name=lisi中的name=lisi
cookies:用户发送给服务器的cookie数据
headers:请求头信息
method:请求方法
url:请求地址
files:用户发送给服务器的文件信息,比如:文件上传时信息
补充:服务器接收用户上传文件:
pic = request.files.get("pic")
pic.save("./123.jpg")
请求勾子
使用装饰器实现监听请求和响应过程
@app.before_first_request
说明:在服务器第一次收到请求前调用,可以做一些初始化,而且只会执行一次,比如连接到数据库
@app.before_request
说明:在请求之前执行
@app.after_request
说明:在请求之后执行
@app.teardown_request
说明:”after_request”和”teardown_request”会在请求处理完成后被调用。区别是”after_request”只会在请求正常退出时才会被调用,它必须传入一个参数来接受响应对象,并返回一个响应对象,一般用来统一修改响应的内容。而”teardown_request”在任何情况下都会被调用,它必须传入一个参数来接受异常对象,一般用来统一释放请求所占有的资源。
以上所以的例子:
from flask import Flask, g, request app = Flask(__name__) @app.before_request
def before_request():
print 'before request started'
print request.url @app.before_request
def before_request2():
print 'before request started 2'
print request.url
g.name="SampleApp" @app.after_request
def after_request(response):
print 'after request finished'
print request.url
response.headers['key'] = 'value'
return response @app.teardown_request
def teardown_request(exception):
print 'teardown request'
print request.url @app.route('/')
def index():
return 'Hello, %s!' % g.name if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
访问”http://localhost:5000/”后,会在控制台输出:
before request started
http://localhost:5000/
before request started 2
http://localhost:5000/
after request finished
http://localhost:5000/
teardown request
http://localhost:5000/
状态保持
cookie
cookie是通过响应将cookie写入到浏览器的
在flask中,先要设置cookie,首先要“做”一个响应
response = make_response('') # make_response这个包需要导入
设置cookie
response.set_cookie('name','zxc')
response.set_cookie('age', '', max_age=3600)
读取cookie
request.cookies.get('name')
删除cookie
response.delete_cookie('name')
session
导入模块:
from flask import Flask, session
加盐:
app.config['SECRET_KEY'] = 'fasf' # 加盐是让你的原始数据加上这个你随意写入的(一般要用个加密算法得出的结果)的数据再加密,确保数据的安全性
设置session
session['name'] = 'zxc'
读取session
name = session.get(‘name’)
name = session['name']
删除session
session.pop('name')
设置session过期时间:
# 过期时间, 通过cookie实现的
from datetime import timedelta
session.permanent = True # 默认是31天
app.permanent_session_lifetime = timedelta(minutes=5) # 指定session具体的过期时间
注意:无论是cookie还是sesion都是存储在浏览器的一个文件中作为状态保持的,而实际应用中,是将私密信息放到服务器的。用Flask中封装的flask_session中的Session来处理,这个会在你的本地和服务器都存储,看你怎么取。
Flask_Script
Flask中的脚本扩展工具包,再开发中我们可以用pycharm来运行,但是部署到服务器就没有pycharm来启动了,需要这些脚本工具
使用步骤
导入模块
from flask_script import Manager
创建脚本管理对象
manager = Manager(app)
使用脚本管理器对象启动程序
manager.run()
再终端上执行脚本命令
python demo.py runserver -p 5001 -d # -d是开启调试模式
添加脚本
Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任务;使得脚本和系统分开;
Flask Script和Flask本身的工作方式类似,只需定义和添加从命令行中被Manager实例调用的命令;
Manager只有一个参数——Flask实例,也可以是一个函数或其他的返回Flask实例;
编码
@manager.command
def test_custom_script():
print u'这⾥里里实在测试⾃自定义脚本,实现⾃自⼰己的逻辑'
使用
初始化:(venv) python manage.py db init 这个命令会在项目下创建 migrations 文件夹,所有迁移脚本都存放其中。
创建第一个版本:(venv) $ python manage.py db migrate -m "initial migration" 检查migrations\versions,会新建一个版本.py,检查里面表格及字段
运行升级 (venv) $ python manage.py db upgrade,会把项目使用的数据库文件,更新为新的表格、字段,同时保留数据
Flask——基础知识的更多相关文章
- flask基础知识
关于flask框架的基础知识 相关基础知识:定义路由,定义参数,获取参数,重定向 简单易懂 ---hello.py # -*- coding: utf-8 -*- # Flask hello worl ...
- 基于Python的Flask基础知识
Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask. 下面我们简单 ...
- Flask 基础知识一
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- 编写一个简单的flask的前后端交互的网页(flask简单知识的讲解)
实验原理: 1.什么是flask Flask是一个使用Python编写的轻量级Web应用框架,其WSGI工具采用Werkzeng,模板引擎使用Jinja2.Flask与 Django之间的区别就是Dj ...
- flask基础之jijia2模板语言进阶(三)
前言 前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) 控制语句 和 ...
- python基础知识的学习和理解
参考链接:https://github.com/yanhualei/about_python/tree/master/python_learning/python_base python基础知识笔 ...
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
随机推荐
- laravel 数据库连接Mysql
找到 config/database.php 'mysql' => [ 'driver' => 'mysql', //数据库的类型 'host' => env('DB_HOST', ...
- Android NDK开发指南(一) Application.mk文件
http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2381586.html Application.mk目的是描述在你的应用程序中所需要的模 ...
- euler证明
我们用g(x)表示x的欧拉函数值,即1~x与x互质的数的个数 欧拉函数公式为: g(x)= y*((x1-1)/x1)*((x2-1)/x2)*((x3-1)/x3)....(其中x1, x2, x3 ...
- [Xcode 实际操作]九、实用进阶-(5)使用正则表达式判断格式是否正确
目录:[Swift]Xcode实际操作 本文将演示使用正则表达式判断邮箱的格式是否正确. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit ...
- [Xcode 实际操作]九、实用进阶-(12)从系统相册中读取图片
目录:[Swift]Xcode实际操作 本文将演示从系统相册中读取图片. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //添加两个协议 ...
- UVA297:Quadtrees(四分树)
题目描述 四象树是每个内结点均有4个子结点的特殊四叉树,它可用于描述平面上黑白图像.平面上的黑白图像是32行×32列的正方形,每个格子称为1个象素,是最小的图像单位.正方形图像可分成四个相等的小正方形 ...
- O(nlogn)求逆序数对的个数
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- 用javascript编写一个简单的随机验证码程序
简单模拟网页的随机数字验证码,效果图如下: html代码: <div id="content"> <div class="left"> ...
- 安装gnvm (windows下nodejs版本管理工具)
一些写在前面的话,为什么装这个?前两天看avalon视频的时候,里面有介绍去哪儿的前端构建工具fekit.我这人吧,好奇心特别强,就打算安装用用看.在安装时它提示要求node版本0.8.x,所以我选择 ...
- Javaoo学习数组