天天的内容python
M 模型 负责数据的操做web
V 视图 负责数据的展现sql
C 控制器 控制你的M的操做以及视图模板的渲染json
在python中叫作MVTflask
M 模型 负责数据的操做segmentfault
V 控制你的M的操做以及视图模板的渲染 业务逻辑的操做浏览器
T templates 模板 负责数据的展现安全
BS browser-》server服务器
CS client-》servercookie
概念: flask是一个很是小的web框架 被称为微型框架 只提供了一个强健的核心 其它的都是经过第三方扩展库来实现
组成:
使用:
安装 pip install flask
from flask import Flask app = Flask(__name__) #实例化flask #路由地址 根据用户不一样的url进行处理 @app.route('/') def index():#处理当前请求的函数 return 'Hello Flask' if __name__ == '__main__': app.run() #运行当前的flask
#路由地址和视图函数名称 是否同名没有关系 #http://127.0.0.1:5000/test/ @app.route('/test/') #路由地址末尾的/建议加上 def test(): return '我是测试使用的视图函数'
http://127.0.0.1:5000/page/10/
@app.route('/page/<pagenum>/') #参数的语法格式 /路由名称/<形参名>/ def page(pagenum): return '当前的页码为{}'.format(pagenum)
#带多个参数 # http://127.0.0.1:5000/arg/10/zhansgan/ @app.route('/arg/<age>/<name>/') def getarg(age,name): return '我叫{} 我见年{}岁了'.format(name,age) # http://127.0.0.1:5000/arg/zhansgan_10/ @app.route('/arg/<name>_<age>/') def getarg(age,name): return '我叫{} 我见年{}岁了'.format(name,age)
#参数类型 # @app.route('/argtype/<arg>/') # @app.route('/argtype/<int:arg>/') #限定参数类型为int # @app.route('/argtype/<float:arg>/') #限定参数类型为float # @app.route('/argtype/<string:arg>/') #限定参数类型为string 默认就是字符串 @app.route('/argtype/<path:arg>/') #其实path就是string 可是path会将路由地址后面的全部的路由或者值都认为是一个值 /不在做为分隔符来使用 def argtype(arg): print(type(arg)) print(arg) return '获取参数类型的视图函数'
注意
@app.route('/response/') def res(): return '我是响应',404 #响应一个指定标准的状态码
from flask import make_response
@app.route('/make_response/') def makeResponse(): res = make_response('我是响应的内容') # res = make_response('我是响应的内容',404) return res
做用: 从一个地址跳向另一个地址
导入
from flask import redirect
实例
@app.route('/') def index():#处理当前请求的函数 return 'Hello Flask' #重定向 @app.route('/redirect/') def redirect_index(): return redirect('/') #参数为路由地址 return redirect('/argtype/redirect_index/') #带参数路由地址的重定向
导入
from flask import redirect,url_for
实例
@app.route('/redirect/') def redirect_index(): url = url_for('test') url = url_for('getarg',name='zhangsan',age=18) #带多个参数 #@app.route('/arg/<name>_<age>/') #def getarg(age,name): return url #/test/
注意:
若是给定的视图函数名称不存在 则抛出异常
@app.route('/redirect/') def redirect_index(): return redirect(url_for('test')) return redirect(url_for('getarg',name='zhangsan',age=18)) #带多个参数
概念:
在视图函数中处理的时候 可使用abort抛出指定状态码的错误 下面代码不在执行
须要抛出标准http的状态码
from flask import abort
实例
@app.route('/abort/') def my_abort(): # abort(404) # abort(500) return '抛出状态码' #捕获500的错误 @app.errorhandler(500) def server_error(e): return '如今能看到了吗{}'.format(e) #捕获404的错误信息 @app.errorhandler(404) def server_error(e): return '您访问的页面被外星人劫持走了!!!'
参数 | 参数说明 | 默认值 |
---|---|---|
host | 主机名 | 127.0.0.1 |
port | 端口号 | 5000 |
debug | 调试 | False |
threaded | 多线程 | False |
实例
if __name__ == '__main__': # app.run(debug=True) #开启调试模式 app.run(host='0.0.0.0',port=5001,debug=True,threaded=True)
说明:
request是由flask框架为咱们提供好的对象 使用时 只要导入便可
用户在请求的时候 框架会为当前请求的用户 建立一个request(请求的对象) 包含当前用户请求的全部信息
导入
from flask import request
实例
@app.route('/request/') def get_request(): print('用户请求的完整的url',request.url) print('去除get传参后的url',request.base_url) print('只有主机和端口号的url',request.host_url) print('获取请求的路由地址',request.path) print(' 请求的方法',request.method) print('获取拼凑的get传参',request.args) print('获取拼凑的get传参',request.args.get('name')) print('获取拼凑的get传参',request.args.get('age')) print('获取表单传递过来的数据',request.form) print('获取文件上传过来的数据',request.files) print('获取用户请求过来的头信息',request.headers) print('获取用户请求过来的全部cookie',request.cookies) print('获取用户请求过来的json数据',request.json) return 'request对象'
cookie
response.set_cookie( key, #设置键 value,#设置值 max_age=None, #过时时间 path = '/' #当前cookie的存储路径 )
@app.route('/get_cookie/') def get_cookie(): print(request.cookies) return request.cookies.get('name','default默认值')
#清除cookie @app.route('/del_cookie/') def del_cookie(): res = make_response('清除cookie') res.delete_cookie('name') return res
cookie存储值为明文存储 安全性低
cookie存在客户端(浏览器中)
cookie默认存活时间为 当前浏览结束(关闭当前的浏览器)
session的使用 须要一个secret_key 来进行加密产生加密的字符串
app.config['SECRET_KEY'] = 'secretkey'
会给cookie设置一个惟一的标识符 sessionId 服务器端会经过cookie携带着惟一的sessionId来区分是哪个用户的请求 若是客户端的cookie被禁用了 那么服务器端的session将没法使用 session基于cookie
#设置session @app.route('/set_session/') def set_session(): 默认存活当前浏览器结束 session['username'] = '张三' return '设置session'
#设置session @app.route('/set_session/') def set_session(): session.permanent = True #设置session持久化存储 #设置当前session的存活时间60秒 若是当前设置失败 那么存活时间为1月 app.permanent_session_lifetime = timedelta(seconds=60) session['username'] = '张三' return '设置session'
#获取session @app.route('/get_session/') def get_session(): return session.get('username','default默认值')
@app.route('/del_session/') def del_session(): #删除 key为username的session session.pop('username') #删除全部session # session.clear() return '删除session'
简介:
就是一个flask终端运行的解析器 经过不一样参数 来设置flask的启动项
安装
sudo pip3 install flask-script
使用
from flask_script import Manager #导入终端运行的解析器 app = Flask(__name__) manager = Manager(app) ... if __name__ == '__main__': manager.run()
-h | 主机 |
---|---|
-p | 端口号 |
-d | 调试 |
-r | 从新加载 |
-threaded | 多线程 |
python manage.py runserver -hpython manage.py runserver -h0.0.0.0 -p5000 -d -r --threaded
python manage.py runserver -d -r
概述
当全部代码越爱越多的时候 在manage.py中 很明显是不合理的 咱们须要将不一样功能的视图函数 存放在不一样的文件中 使用咱们的项目的目录结构更加的清晰
使用
from flask import Blueprint user = Blueprint('user',__name__) @user.route('/login/') def login(): return '登陆'
from mysession import mysession from user import user #http://127.0.0.1:5000/login/ app.register_blueprint(user) #注册蓝本 #http://127.0.0.1:5000/user/login/ app.register_blueprint(user,url_prefix='/user') #注册蓝本并添加前缀
@app.route('/') def index(): # return '首页' return redirect('/user/login/') return redirect(url_for('user.login')) #使用url_for反向构造出路由的时候 须要指定当前的视图函数 是哪个蓝本对象的
在manage文件中使用
钩子函数 | 功能描述 |
---|---|
before_first_request | 第一次请求以前 |
before_request | 每次请求以前 |
after_request | 每次请求以后 没有异常 |
teardown_request | 每次请求以后 即便有异常出现 |
实例
@app.before_first_request def before_first_request(): print('before_first_request') @app.before_request def before_request(): print('before_request') if request.method == 'GET' and request.path == '/form/': abort(500) @app.after_request def before_request(r): print('before_request',r) return r @app.teardown_request def teardown_request(r): print('teardown_request') return r
钩子函数 | 功能描述 |
---|---|
before_app_first_request | 第一次请求以前 |
before_app_request | 每次请求以前 |
after_app_request | 每次请求以后 没有异常 |
teardown_app_request | 每次请求以后 即便有异常出现 |
实例
@user.before_app_first_request def before_first_request(): print('before_first_request') @user.before_app_request def before_request(): print('before_request') if request.method == 'GET' and request.path == '/form/': abort(500) @user.after_app_request def after_request(r): print('after_request',r) return r @user.teardown_app_request def teardown_request(r): print('teardown_request') return r
注意:
钩子函数写在蓝本或者启动文件中 均可以捕获到全部的请求和响应(同样)一个flask中只须要写一个钩子函数而不须要重复写钩子函数