1最小flask应用
1.1安装flask
virtualenv --no-site-packages flaskenv8
pip install flask
然后新建一个空文件夹,用pycharm打开,然后在空文件夹中创建一个py文件
1.2最小应用
from flask import Flask
app = Flask(__name__)
@app.route('/hel/')
def hello():
return 'hello wrold'
if __name__ == '__main__':
app.run()
最小应用代码注释
1.导入Flask类
2.生成一个flask的对象,传入name参数,表示模块名或包名
3.告诉服务器,访问127.0.0.1:5000/hel/地址可触发hello方法;类似django中的urls.py文件的功能
6.直接启动本文件,才执行app.run()
1.3启动最小应用
if __name__ == '__main__':
ip = sys.argv[1]
port = sys.argv[2]
app.run(host=ip, port=port, debug=True)
host代表启动时的ip地址;port代表启动的端口;debug代表启动的模式,debug=True为调试模式; ctrl+s后会自己启动项目。
可以直接用1.2节中的app.run()直接启动应用,但是,这样就不能修改ip和端口,而用本方法能够修改ip和端口。启动指令为python hello.py 0.0.0.0 82(文件名+ip+端口)
1.4使用manage启动文件
先安装flask_script库
pip install flask-script
设置manage
from flask import Flask
from flask_script import Manger
manage=Manage(app)
@blue.route('/hello/')
def hello():
return '还有几天放假
if __name__ == '__main__':
manage.run()
manage = Manager(app):管理flask应用对象app
启动命令
python manage.py runserver -h 0.0.0.0 -p 80 -d
-h 表示ip地址 ;-p表示端口 -d表示debug模式
flask-script - 管理启动命令
flask-blueprint - 管理路由地址
2拆分视图函数
背景:模块化管理路由地址
安装蓝图库
pip install flask-blueprint
初始化蓝图对象,并使用对象管理路由
blue = Blueprint('first', __name__)
管理路由:@blue.route('/hello/')
@blue.route('/hello/')
def hello():
return '还有几天放假'
在manage页面注册蓝图
app.register_blueprint(blueprint=blue, url_prefix='/app')
第一个参数为引入的blue对象,第二个参数为路由的前缀;
当页面出现cannot import 。。(不能导入某数据时)原因为两个页面出现互相引用
3路由规则
在flask中也可以在路由后面接参数;格式为<转换器:参数>
<int:id> 表示接受的id值为int类型
<string:name> 表示接收的name参数为string类型,可简写为<name>类型
<float:num> 表示接收的num参数为浮点类型
<uuid:uid> 表示接收的uid参数为uuid类型值
<path:path> 表示接收的p变量为路径
@blue.route('/stu/<int:id>/')
def stu(id):
print(type(id))
return 'hello stu id:%d' % id
@blue.route('/name/<string:name>/')
def stu_name(name):
print(type(name))
return 'welcome stu:%s' % name
@blue.route('/float/<float:num>/')
def float_num(num):
print(type(num))
# return 'float num:%s' % num #将小数当成字符串输出
return 'float num:%.2f' % num 将小数保留两位小数输出
@blue.route('/get_uuid/')
def get_uuid():
import uuid
return 'uuid:%s' % str(uuid.uuid4())
@blue.route('/uuid/<uuid:uid>/')
def uid(uid):
return 'uid:%s' % uid
@blue.route('/path/<path:p>/')
def get_path(p):
return 'path:%s' % p
4重定向
重定向分为直接重定向和反向解析重定向两种
4.1直接重定向
@blue.route('/redirect_hello/')
def redirect_hello():
return redirect('/app/hello/')
直接重定向由路由的绝对路径构成
4.2反向解析重定向
反向解析重定向由url_for来完成,其形式为url_for('生成蓝图的第一个参数.重定向的函数名'),又可分为无参跳转和有参跳转两种
@blue.route('/redirect_hello/')
def redirect_hello():
return redirect(url_for('first.hello'))
@blue.route('/redirect_hello/')
def redirect_hello():
return redirect(url_for('first.float_num', num=10.1))
5错误抛出与捕获
1导包:from flask import abort
2使用:abort(500)
捕获:@blue.errorhandler(500)
抛出错误码时,错误码必须符合http定义的状态码,且抛出的错误码要符合运用场景
@blue.route('/index/')
def index():
try:
1/0
except Exception as e:
abort(500) # 抛出500错误
return 'hello'
抛出错误并捕获500错误
@blue.errorhandler(500)
def error_500(e):
return 'exception :%s' % e
6页面渲染
html模板文件需存在于templates文件夹下,且templates和manage.py文件同级
@blue.route('/my_index/', methods=['GET', 'POST', 'PATCH'])
def my_index():
if request.method == 'GET':
return render_template('index.html')
if request.method == 'POST':
pass
页面渲染:render_template('index.html')
请求方式:@blue.route('/my_index/', methods=['GET', 'POST', 'PATCH']),不写methods时默认为get
7请求与响应
7.1获取前端传回的数据
当为get请求方式时,获取从前端传回的参数使用args获取
request.args.get(key)
request.args.getlist(key)
前者只获取一个值,后者会将所有传递过来参数名为key的组成一个列表返回
当请求方式为post/put/patch/delecte时,获取数据用form获取
request.form.get(key)
request.form.getlist(key)
同args一样,前者也只取一个值,后者取key对应的所有值并组成一个列表
7.2获取请求方式
request.method
7.3获取路由
request.path
7.4获取cookie
request.cookies
7.5获取文件
request.files
7.6响应
创建响应:make_response(响应内容,响应状态码),状态码默认200,可不写
设置cookie: 响应对象.set_cookie(key, value, max_age)
删除cookie:响应对象.delete_cookie(key)
响应字符串
@blue.route('/response/', methods=['GET'])
def get_response():
res = make_response('<h3>2019</h3>', 200)
return res
响应模板文件
@blue.route('/response/', methods=['GET'])
def get_response():
html = render_template('index.html')
res = make_response(html, 200)
res.set_cookie('token', '09876543210', max_age=100)
res.delete_cookie('token')
return res
网友评论