flask 入门
pip install flask
简介:flask是小的python web框架 只提供了一个强健的核心,其它功能都是提供扩展库去实现的,其它功能都是提供扩展库去实现的
@app.route('/') # 路由
def index(): # 视图函数
return 'hello'
#启动参数
app.run()
debug 默认为Flase True 调试模式,自动加载代码
port 指定端口号
host 指定主机名 host='0.0.0.0'
thredad 线程 Ture
###
if __name__ == '__main__':
app.run(host='0.0.0.0', port='5001', debug=True, threaded=True)
###
#视图函数传参
(1)使用无参路由
@app.route('/')
def index(): #视图函数
return 'hello'
(2)使用参数路由
@app.route('/find/<name>')
def findGirl(name):
return '这个人是{0}'.format(name)
(3) 参数的类型
#限制参数类型<int:arg> <float:arg>
#默认字符串
@app.route('/arg_type/<int:arg>')
def arg_type(type(arg)):
print(type(arg))
#将路由地址后所有的字符都匹配为字符串
@app.route('/arg_type/<path:arg>')
def arg_type(type(arg)):
print(type(arg))
print(arg)
************************************
输入:http://127.0.0.1:5001/arg_type/2/ssss
输出: str
2/ssss
#参数类型
(1)string 默认字符串
(2)int 限制传递进来的参数为 int类型 不做类型的转换
(3)float 限制传递进来的参数为 float类型 不做类型的转换
(4)path 将请求的路由地址后面的所有参数 都认为是一个参数的值,不再做路由的查找
#路由地址传递多个参数
@app.route('/many_arg/<a>_<b>')
@app.route('/many_arg/<a>/<b>')
def many_arg(a,b):
return '传递多个参数第一个 {0} 第二个 {1} '.format(a,b)
----------------------------------------------------
#####注意事项
1. 路由的末尾加/
2.int:参数名称
3.path其实也是字符串类型 只是参数的/不再认为是路由的分隔符
####视图的响应
(1) 手动制造响应
return,404
return 返回类型不能为int类型
###重定向
from flask import redirect
@app.route('/redirect/')
def myRedirect():
return redirect('/')
@app.route('/redirect/')
def myRedict():
# return '正常请求'
# return redirect('/many_arg/1/2')
print('-----------------------------------------')
# print(url_for('index')) #index是视图函数的名
# print(url_for('index'))
print(url_for('many_arg', a=1, b=2))
return redirect(url_for('many_arg', a=1, b=2))
#输出结果:-----------------------------------------
/many_arg/1/2
####abort 抛出指定的状态码,http指定状态码
#异常捕获
@app.route('/look_meizi')
def look_meizi():
abort(404)
# 捕获指定的状态码
@app.errorhandler(404)
def page_not_found(e):
return '你请求的地址被外星人带走了'
----------------------------------------------
#请求与响应
current_app 当前app实例化的代理对象,获取当前app的所有公共配置
@app.route('/current_app')
def myGetConfig():
# 拿到app所有的配置
return current_app.config['secret_key']
----------------------------------------------
#全局变量g
#在一次请求中 可以全局获取
例子和使用详见钩子函数或者模版
------------------------------------------------
#request
包含了所有的请求信息
@app.route('/request')
def get_http_message():
print('----------------------------')
print(request.url)
print(request.base_url)
print(request.host_url)
print(request.path)
print(request.method)
print(request.args)
print(request.args.get('name', 'none'))
# 获取表单传递过来的数据
print(request.form)
# 获取表单文件上传的数据
print(request.files)
print('获取cookies', request.cookies)
print('请求头', request.headers)
return 'request对象'
-------------------------------------------
@app.route('/get_arg')
def get_arg():
print(request.args)
print(request.args.get('b'))
print(request.args.getlist('a'))
return '获取多个get传参'
## 会话控制 cookie和session
#原因是:http协议是无状态协议
cookie
response.set_cookie(
key,#键
value,#值
max_age,#以秒为单位的cookie存活时间
expires,失效时间需要datetime对象
path = '/',储存的路径
)
@app.route('/get_cookie')
def get_cookie():
response = make_response('设置cookie')
# 不设置存活时间,默认为当前浏览会话结束,也就是关闭当前浏览器,并不是标签页
return request.cookies.get('name', '什么都没有')
#移除cookie
response.delete_cookie('name')
session
cookie每次携带着唯一的sessionid来进行请求访问,服务端根据sessionid来区分不同用户的请求,所以sesion是基于cookie的,服务端会给米一个请求创建一个session对象
(1)设置session
@app.rout('/set_session')
def set_session():
session['username'] = 'lisi'
return '设置session'
(2)获取session
@app.route('/get_session')
def get_session():
return session.get('username')
(3) 删除session
@app.route('/del_session')
def del_session():
return session.pop('username')
(4)设置过期时间
@app.route('/set_session')
def set_session():
session['username'] = 'lisi'
session_life_time = timedelta(minutes=10)
# 设置session的持久化
session.permanent = True
app.permanent_session_lifetime = session_life_time
return '设置session'
flask-script 扩展库
概念:一个flask终端的运行解析器,因为在项目完成之后,不应该有任何的改动,所以需要接种终端来完成不同启动项的配置
-h 主机名
-p 指定端口号
-threader 开启多线程
-d 开启调试模式
-r 代码修改后重新加载
blueprint蓝图
当代码越来月复杂时,视图文件不应该放在一个文件中,使用蓝本将不同模块功能的视图函数做成一个视图函数,放在一个文件中
from flask import Flask, session, request, Blueprint
app.register_blueprint(mysession,url_prefix = '/user')
from mysession import mysession
--------------------------------------------------------
#在mysession中
from flask import Blueprint, session
# 设置session
mysession = Blueprint('mysession', __name__)
@mysession.route('/set_session')
def set_session():
session['username'] = 'lisi'
session_life_time = timedelta(minutes=10)
# 设置session的持久化
session.permanent = True
app.permanent_session_lifetime = session_life_time
return '设置session'
# 获取session
@mysession.route('/get_session')
def get_session():
return session.get('username')
# 删除session
@mysession.route('/del_session')
def del_session():
return session.pop('username')
*两个架构:
* B/S
* C/S
钩子函数
类似与django中间件 在使用的时候需要使用装饰器
在主程序中使用
#钩子函数 | #功能描述
before_first_request | 第一次请求之前
before_request | 每次请求之前
after_request | 每次请求之后 前提是没有出现异常
teardown_request | 每次请求之后 即使出现异常
钩子函数使用在蓝本中
#钩子函数 | #功能描述
before_app_first_request | 第一次请求之前
before_app_request | 每次请求之前
after_app_request | 每次请求之后 前提是没有出现异常
teardown_app_request | 每次请求之后 即使出现异常
模版引擎
按照一定的规则 负责展示并渲染一个html页面给用户 模版给拱了替换的规则
使用的模版引擎
jinja2 由flask开发
一、模版的使用
(1)创建模板目录
project/
templates/
模板文件
(2)创建模板目录
1.变量
{{ 变量名称 }}
2.标签
{% 标签名称 %}
过滤器
var|abs 绝对值
var|default() 默认值 只有未定义才采取默认值 可加参数 boolean=True
var|first 取出var值中第一个值
绝对值{{ data.num|abs }}
默认值{{ data.bool|default('default') }}
默认值{{ data.none|default('default',boolean=True) }}
第一个值{{ title|first }}
格式化值{{ '我叫%s,我今年%s岁,我的存款为%s'|format('雷神',18,200) }}
长度{{ title|length }}
合并字符串{{ ['a','b']|join('x') }}
safe{{ data.h3|safe }}
int{{ data.num|int }}
float{{ data.num|float }}
三、标签
*语法{% tag %}
<h2>分支</h2>
{% if data.bool %}
{{data.bool}}为真
{% else%}
{{ data.bool }}为假
{% endif %}
{% for k,v in data.items()%}
{{ k}}{{v}}
{% endfor%}
文件的包含
主题结构
{% include(‘模版名称’) %}
提交表单 使用wtf第三方
文件上传与邮件发送
sqlalchemy 模型
安装pip install flask-sqlalchemy
orm使用的好处
1.增加sql的重复使用率
2.使表容易阅读
3.可移植性
一、原生数据库
(1)新建一个数据库
create database if not exists 库名 character set utf8;
alter database 库名 character set utf8;
alter table 表名 character set utf8;
alter table 表名 modify 字段名 字段类型 可选约束条件 character set utf8
(2) 安装数据库模块
pip install pymysql
(3)安装flask-sqlalchemy
pip install flask-sqlalchemy
(4) 配置路径
DB_URI= 'mysql+pymql://root:password@host:port/demo'
from sqlalchemy import create_engine
HOST = '127.0.0.1'
USERNAME = 'root'
PASSWORD = '12345'
DATABASE = 'demo'
PORT = '3306'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(
USERNAME, PASSWORD, HOST, PORT, DATABASE)
engine = create_engine(DB_URI)
with engine.connect() as db:
data = db.execute('select * from user')
db.execute('delete from user where id=1')
二、在flask中使用ORM模型
配置
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask('__name__')
# 实例化ORM
db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysql://root:12345@127.0.0.1:3306/demo'
@app.route('/')
def index():
return '首页'
if __name__ == '__main__':
app(debug=True)
三、设计表模型
字段类型
id |