1.Flask认识
- Flask核心:werkzeug(路由分发)和Jinja2(模板渲染),轻量级的web框架;
- 如果只安装Flask,都没有ORM(无法操作数据库),后台管理等;
2.框架对比
- 如何选择web框架?
- 1.开发周期:要求进度快,建议选择django;
- 2.功能需求:比较复杂,需要使用各种第三方或是自己实现的工具,建议使用Flask;
- 3.后期维护:如果迭代不是特别频繁,建议选择django;
- 4.熟悉程度:自己对各种框架的熟悉程度;
3.环境安装:
- 虚拟环境:独立于真实系统环境外,拥有独立的python解释器和依赖包;
# 创建虚拟环境、进入、退出等指令,不是Linux系统自带的指令;
# 需要安装工具包才能使用,配置环境变量
pip install virtualenv
pip install virtualenvwrapper
# 安装成功,且配置环境变量后,才能使用workon/rmvirtualenv等指令
# 安装过程中,如果遇到报红OSError,网络不好或网络不通,测试网络是否畅通,多次尝试重新安装
# 创建py3的解释器虚拟环境,需要联网安装,
mkvirtualenv -p python3 sy_py33
# 安装Flask并指定版本,如未指定,默认安装最新版
pip install flask==1.0.2
# 其它指令,卸载安装包,退出虚拟环境,移除虚拟环境
pip uninstall flask
deactivate
rmvirtualenv 虚拟环境名称
4.基本程序
from flask import Flask
# 步骤:
# 1.导入Flask类(项目名称和py文件名,禁止使用标准模块名,比如:random、json,或是flask)
# 2.创建程序实例app
# 3.使用程序实例app,定义路由和视图
# 4.启动服务器
app = Flask(__name__)
@app.route('/')
def index():
return 'hello world'
if __name__ == '__main__':
# Flask默认是5000端口,
# 如果修改端口port参数
# 七行代码本质:实现了web服务器
app.run(port=8000)
- run方法参数
# 参数:host、port、debug
# 1、host表示主机,当前系统内,默认127.0.0.0,
# 127.0.0.1和0.0.0.0区别?
# 127表示本机回环地址,当前系统外无法访问;比如:在虚拟机中运行项目,只能虚拟机内访问,win系统无法访问;
# 0.0表示任意ip,当前系统外可以访问,比如:在虚拟机中运行项目,虚拟机内可以访问,win系统访问可以通过访问虚拟机的真实ip,访问项目;
# 2、port表示端口,当前系统内,区分不同的应用;
# 3、debug表示调试模式,
# 3.1自动跟踪代码的变化,不需要手动重启
# 3.2帮助定位错误信息
# 3.3只能在开发环境下使用,线上项目禁止使用
app.run(host='0.0.0.0',port=8000,debug=True)
5.Flask1.x版本的新启动方式
- 两种启动方式:本质是相同的
- 1.通过终端(系统终端或是pycharm终端)命令:
- 1.1需要添加环境变量,
- export FLASK_APP=启动文件名
- export FLASK_ENV=development/production
- 1.2启动项目:flask run
- 1.1需要添加环境变量,
- 2.使用pycharm软件:
- 2.1pycharm中选择编辑配置信息,选择module-name,配置环境变量,启动项目
- 2.2旧版本pycharm软件,需要删除script-path中内容,直接在parmeters中-m flask run配置,配置环境相同;
- 1.通过终端(系统终端或是pycharm终端)命令:
6.路由信息
- 定义方式:route方法
from flask import Flask
app = Flask(__name__)
# 路由:
# 1.url路径必须以斜线开始
# 404找不到
# http://127.0.0.1:5002/
# http://127.0.0.1:5002/abc
@app.route('/abc',methods=['POST'])
def index2019():
return 'hello 2019'
# http://127.0.0.1:5002/static/index.html
# AssertionError: View function mapping is overwriting an existing endpoint function: index2020
# 视图函数重名了
@app.route('/abc',methods=['GET'])
def index2020():
return 'hello 2020'
if __name__ == '__main__':
# 打印所有的路由规则,路由映射
print(app.url_map)
app.run(port=5002)
"""
Map(
[
<Rule '/123' (HEAD, OPTIONS, GET) -> index>,
Flask默认创建的静态路由,作用是方便访问静态文件;
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>
]
)
Map:类、列表、列表容器,存储了所有的路由信息;
相当于django中urls.py文件中urlpattern
Rule:类、规则,url路径、请求方法和视图函数名的映射(指向)关系;
url路径的匹配:先匹配路径,再匹配请求方法,满足条件,执行对应的视图;
从上到下依次匹配,如匹配成功,不会继续匹配;
"""
7.路径参数
from flask import Flask
app = Flask(__name__)
# Flask中url路径中的尖括号,叫做转换器,本质是正则表达式
# 路由变量:路径参数,url路径的一部分,必须要有
# http://127.0.0.1:5002/13012345678
# 查询参数:查询字符串,在url中可有可无,问号后面,与号分隔,等号传值;
# http://127.0.0.1:5002/?mobile=13012345678&user_id=1001
# 基本语法:<参数名>,必须作为视图函数的参数传给视图
@app.route('/<temp>')
def index(temp):
return 'hello world %s' % temp
if __name__ == '__main__':
print(app.url_map)
app.run(port=5003)
- Flask内置6种转换器:
- string、int、float、any、path、uuid
from flask import Flask
# Flask的核心werkzeug中的路由模块中,有转换器源码
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# Flask中url路径中的尖括号,叫做转换器,本质是正则表达式
# 路由变量:路径参数,url路径的一部分,必须要有
# http://127.0.0.1:5002/13012345678
# 查询参数:查询字符串,在url中可有可无,问号后面,与号分隔,等号传值;
# http://127.0.0.1:5002/?mobile=13012345678&user_id=1001
# 基本语法:<参数名>,必须作为视图函数的参数传给视图
# 默认的是unicodeconverter,兼容数值、字符串;
# 限制路径参数的数据类型,int、float
"""
import re
# 正则执行多次,需要要编译多次
re.findall('\d',data)
re.match('\d',data)
# 只需要编译一次,多次执行,正则的效率比直接使用findall和match要高
com = re.compile('\d')
com.match()
"""
@app.route('/<int:temp>')
def index(temp):
return 'hello world %s' % temp
if __name__ == '__main__':
print(app.url_map)
app.run()
- 自定义转换器
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 需求:匹配url路径中的参数,手机号
# http://127.0.0.1:5004/mobile/13012345678
"""
实现步骤:
1、定义类,需要继承自基础转换器
2、定义属性,正则表达式,regex
3、把自定义的转换器类,添加到默认的转换器字典容器中
"""
class MobileConverter(BaseConverter):
regex = '1[3-9]\d{9}'
app.url_map.converters['re_mobile'] = MobileConverter
# 使用自定义的转换器
@app.route('/mobile/<re_mobile:mobile>')
def index(mobile):
return 'hello world {}'.format(mobile)
8.处理请求
- request:请求上下文对象,处理请求信息
- 常用属性:args/form/data/files/cookies/json等
@app.route('/',methods=['GET','POST'])
def index():
# 1----args,表示查询字符串
# http://127.0.0.1:5003/?mobile=13012345678&user_id=2020
# mobile=13012345678,user_id=2020
# mobile = request.args.get('mobile')
# user_id = request.args.get('user_id')
# print('mobile={},user_id={}'.format(mobile,user_id))
# 2----form,表示表单参数
# mobile = request.form.get('mobile')
# pswd = request.form.get('pswd')
# print('mobile={},pswd={}'.format(mobile,pswd))
# 3----json,表示json数据
# user = request.json.get('user')
# pswd = request.json.get('pswd')
# print('user={},pswd={}'.format(user,pswd))
# 4----url/method
# print('*'*50)
# print(request.url)
# print(request.method)
# print('*'*50)
# 5----headers,请求头信息
print('*'*60)
print(request.headers)
print('*'*60)
# 6----files,表示文件
# 使用postman传文件时,如果后台无法保存文件
# 一定要把Content-Type删掉;
image = request.files.get('image')
# 保存文件,with open("666.jpg","wb")
image.save('./666.jpg')
return 'hello world'