Flask-基本入门
简介
- flask被称为微型框架,只提供了一个强健的核心,其他功能全部通过扩展库来实现;也就是说可以根据项目需要量身打造。他适合入门学习以及高手研究。
- 组成:WSGI、模板引擎(Jinja2)
WEB工作原理
- B/S和C/S架构
- B/S架构工作原理
- 客户端(浏览器) <=> WEB服务器(nginx) <=> WSGI(uWSGI) <=> Python(flask) <=> 数据库(MySQL)
- 说明:flask框架自带了一个测试服务器,没有考虑性能部署。
配置虚拟环境
-
安装virtualenv:
pip3 install virtualenv
- 创建虚拟环境:
virtualenv venv
- 启动虚拟环境:
source venv/bin/activate
- 退出虚拟环境:
deactivate
- 创建虚拟环境:
-
安装virtualenvwrapper:
-
安装pip:
sudo apt-get install python-pip
-
安装virtualenvwrapper:
pip install virtualenvwrapper
-
配置:
- 常见专门用于存放虚拟环境的目录:
~/.virtualenvs
- 在文件
~/.bashrc
末尾添加如下内容:
export WORKON_HOME=$HOME/.virtualenvs source $HOME/.local/bin/virtualenvwrapper.sh alias mkvirtualenv='mkvirtualenv -p /usr/bin/python' alias mkvirtualenv3='mkvirtualenv -p /usr/bin/python3'
重新加载:source ~/.bashrc
- 常见专门用于存放虚拟环境的目录:
-
-
查看虚拟环境
- lsvirtualenv 或 workon
-
创建虚拟环境
- python2:
mkvirtualenv 虚拟环境名
- python3:
mkvirtualenv3 虚拟环境名
- python2:
-
使用虚拟环境:
workon 虚拟环境名
-
退出虚拟环境
deactivate
-
删除虚拟环境
rmvirtualenv 虚拟环境名
-
安装flask
- 创建虚拟环境:
mkvirtualenv3 flask
- 安装flask:
pip install flask
- 创建虚拟环境:
使用测试
- 代码:祥见《manage.py》本文最下方
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello world!</h1>'
if __name__ == '__main__':
app.run()
-
启动:
python manage.py runserver
-
测试:浏览器输入
127.0.0.1:5000
-
启动参数
参数 说明 debug 是否开启调试模式,默认为False,开启后代码修改会自动加载 threaded 是否开启多线程 port 指定端口 指定主机,设置为'0.0.0.0'可以通过IP进行访问 app.run(debug=True, threaded=True, port=5050, host='0.0.0.0')
请求与响应
-
变量或对象
名称 上下文 说明 current_app 程序上下文 当前运行的应用实例 g 程序上下文 全局对象,处理请求的临时数据 request 请求上下文 请求对象,包含了客户端所有的HTTP请求信息 session 请求上下文 用户会话,用于保存需要'记住'的信息 -
请求钩子函数
函数 说明 before_first_request 第一次请求之前 before_request 每次请求之前 after_request 每次请求之后,前提是没有异常 teardown_request 每次请求之后,无论是否有异常 所谓的钩子函数,就是框架给用户预留的后门
视图函数
-
无参路由
@app.route('/test/') def test(): return 'for test yyy'
-
带参路由
# 带参路由,参数写在尖括号中
@app.route('/welcome/<name>')
def welcome(name):
return 'Hello %s!' % name
# 限制参数类型
@app.route('/user/<int:uid>')
def user(uid):
return '%d 号,你好' % uid
# path类型参数
@app.route('/path/<path:p>')
def path(p):
return p
# 多个参数处理
@app.route('/username/<name>/uid/<uid>')
def userinfo(name, uid):
return name + uid
-
说明
- 路由最后的'/'加上后,在测试时(浏览器中)加不加都可以
- 若需要参数,参数需要写在<>中,对应视图函数的参数要与路由参数一致
- 若需要指定参数类型,如:int/float/path等,应该写在参数名之前,使用':'与参数名分割
- 若不指定参数类,默认为string,path其实也是字符串,只不过'/'不再是分隔符
请求(request)
- 客户端的所有的请求信息都放在了request对象中
- 常用:url、method、args、headers等
响应(resposne)
- 直接返回一个字符串即可,默认状态码为200,表示成功
- 返回一个元组,即在字符串后直接指定状态码
- 也可以先创建一个响应对象,然后返回该响应对象
重定向(redirect)
- 说明:当网站的URL更换时,有需要对老的地址进行支持
- redirect:重定向函数
- url_for:根据视图函数名构造路由地址,参数是视图函数名
终止(abort)
- abort:向系统抛出一个异常,系统会捕获并作出统一处理
- @app.errorhandler:定制错误显示
扩展:
- MVC:就是为了解耦
- M:model,模型,即数据模型
- V:view,视图,负责显示逻辑
- C:controller,控制器,负责业务逻辑处理
- MTV:功能同MVC
- M:model,模型,即数据模型
- T:template:模板,负责显示逻辑
- V:view function,视图函数,负责处理业务逻辑
详细代码
# manage.py
# 导入类库
from flask import Flask
from flask import request
from flask import make_response
from flask import redirect
from flask import url_for
from flask import abort
# 创建对象
app = Flask(__name__)
# 配置路由
@app.route('/')
def index():
return 'Hello world'
# 无参路由
@app.route('/test/')
def test():
return 'for test yyy'
# 带参路由,参数写在尖括号中
@app.route('/welcome/<name>')
def welcome(name):
return 'Hello %s!' % name
# 限制参数类型
@app.route('/user/<int:uid>')
def user(uid):
return '%d 号,你好' % uid
# path类型参数
@app.route('/path/<path:p>')
def path(p):
return p
# 多个参数处理
@app.route('/username/<name>/uid/<uid>')
def userinfo(name, uid):
return name + uid
@app.before_first_request
def first():
print('first')
@app.route('/request/')
def req():
# 完整的请求地址URL
# return request.url
# 不包含get参数的请求地址
# return request.base_url
# 只有主机和端口
# return request.host_url
# 只有装饰器中的路由地址
# return request.path
# 请求方式
# return request.method
# 远程客户端地址
# return request.remote_addr
# 获取get参数,有同名获取第一个
# return request.args['name']
# return request.args.get('password')
# 获取一个键对应的所有值的列表
# print(request.args.getlist('name'))
# 获取请求头信息
return request.headers['User-Agent']
# 响应
@app.route('/response/')
def response():
# 响应,返回一个字符串即可,默认状码为200,表示ok
# return 'OK'
# 返回时可以直接指定状态码
# return 'page not found', 404
# 先用专门的函数构造一个响应对象,然后返回,可以指定状态码
resp = make_response('这是通过函数构造的响应', 404)
return resp
@app.route('/old/')
def old():
# return '旧内容'
# return redirect('/new/')
# 根据视图函数名反向的构造出路由地址
# return url_for('new')
# 可以构造带参的路由
# return url_for('welcome', name='xiaoming', uid=250)
return redirect(url_for('new'))
@app.route('/new/')
def new():
return '新内容'
@app.route('/abort/')
def err():
# 抛出异常给系统,参数是状态码
abort(404)
return 'abort测试'
# 定制404错误
@app.errorhandler(404)
def page_not_found(e):
return '大哥,是不是搞错了'
if __name__ == '__main__':
# 启动
app.run(debug=True, threaded=True, port=5050)
网友评论