Flask框架教程汇总(1)---其中有视图+cookie session+ 蓝本 等

本节目录:
1 完整的flask启动
2 视图函数传单个参数
3 参数类型
4 视图的响应
5 重定向—>redirect和url_for的结合
6 请求与响应
7 会话控制 cookie和session
8 flask-script扩展库
9 Blueprint 蓝本/蓝图
10 钩子函数

本教程的flask环境都是在ubuntu 16.04下 —python3.5—IDE为pycharm 如果有任何问题可以留言哦 !


使用 Flask, 需要先安装—->pip3 install flask

简介:flask是一个小的python web框架 只提供了一个强健的核心 其它功能都是提供扩展库来去实现的

一、完整的flask启动

创建一个名为manage.py的python文件, 并导入flask

from flask import Flask
app = Flask(__name__) #__main__     manage
@app.route('/') #路由
def index(): #视图函数
    return 'Hello Flask'
if __name__ == '__main__:

    app.run()

此时直接运行run这个名为manage.py的文件,会看到控制台显示以下示例, 说明服务器启动成功, 然后打开本机浏览器输入http://127.0.0.1:5000/ 即可看到 ‘Hello Flask’ 表示一个简单的flask项目运行了起来. (随后我们将不会再使用本方法启动服务器, 会换成manage方法启动,后面会有讲到)

 * Serving Flask app "manage" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

路由

@app.route('/')
def index(): #视图函数
    return 'Hello Flask'

启动参数

app.run()

(1) debug 默认为Flase True 调试模式 自动加载代码

(2) port 指定端口号

(3) host 指定主机名 host=’0.0.0.0’

(4) threaded 线程 True

二、视图函数传单个参数

(1) 使用无参路由

@app.route('/') #路由
def index(): #视图函数
    return 'Hello Flask'

(2) 有参路由

带参路由

@app.route('/find_girl/<name>')
def findGirl(name):
    return '找到了,名字是{}'.format(name)

三、参数类型

(1) string 默认就为字符串

(2) int 限制传递进来的参数为 int类型 不做类型的转换

(3) float 限制传递进来的参数为 float类型 不做类型的转换

(4) path 将请求的路由地址后面的所有参数 都认为是一个参数的值 不再做路由的查找

路由地址传递多

@app.route('/many_arg/<a>/<b>')
def many_arg(a,b):
    print(a,b)
    return '传递多个参数'

注意事项

  1. 路由末尾的/建议都加上 因为在需要的时候 浏览器会自动帮你添加上
  2. 路由参数的限制 前面int/float/path/string 使用:和参数名称隔开
  3. path其实也是字符串类型 只是参数的/不再认为是路由的分隔符 而是认为是参数

四、视图的响应

(1) 手动构造响应

return ‘响应的内容’,code 状态码

(2) make_response 来构造响应

from flask import make_response

五、重定向

from flask import redirect,url_for

redirect 不传参数重定向

@app.route('/redirect/')
def myRedirect():
    # return '正常请求'
    return redirect('/')#导入redirect  参数为路由地址

传参重定向

return redirect('/')#导入redirect  参数为路由地址
带参数
return redirect('/many_arg/1/2')#导入redirect  

url_for

无参
参数为路由地址

print(url_for('index')) #index是视图函数的名
print(url_for('indexxx')) #如果视图函数不存在 则抛出构造路由失败的异常

使用url__for构造带参路由
print(url_for('many_arg',a=1,b=2)) #index是视图函数的名

redirect和url_for的结合使用

return redirect(url_for('many_arg',a=1,b=2)) #index是视图函数的名

abort 终止 抛出指定的状态码

必须是标准的http状态码

    @app.route('/look_meizi/')
    def look_meizi():
        abort(500)
        # abort(404)

    #捕获指定的状态码  错误页面的定制
    @app.errorhandler(404)
    def page_not_found(e):
        return '你请求的地址被外星人挟持走了!!!'
        # return e

    @app.errorhandler(500)
    def server_error(e):
        return e

六、请求与响应

(1)current_app 当前app实例化的代理对象 获取当前实例化app的所有公共配置和实例化的app

实例

    @app.route('/current_app/')
    def myGetConfig():
        # return app.config['secret_key']
        return current_app.config['secret_key'] #拿到app的所有的配置

(2) 全局变量g

在一次请求中 可以全局获取

例子和使用详见钩子函数或者模板

(3) request

请求对象 包含了所有的http的请求信息

    @app.route('/request/')
    def get_http_message():
        print('获取完整的请求url',request.url) #获取完整的请求url
        print('获取去掉get传参的url',request.base_url)#获取去掉get传参的url
        print('获取主机名部分的url',request.host_url) #获取主机名部分的url
        print('获取路由地址',request.path) #获取路由地址
        print('获取请求的方法',request.method)
        print('获取get传参',request.args)
        获取指定key对应的值
        print('获取get传参',request.args['name'])
        print('获取get传参',request.args.get('name','该key不存在'))
        print('获取form表单传递过来的数据',request.form)
        print('获取form表单文件上传的数据',request.files)
        print('获取请求头信息',request.headers)
        print('获取cookie信息',request.cookies)
        print('获取传递过来的json',request.json)
        return  'request对象'

当get传参的key为相同时 的取值方式

request.args.getlist(key)

实例

    请求的url http://127.0.0.1:5001/get_arg/?a=1&a=2&c=3
    @app.route('/get_arg/')
    def get_arg():
        # print(request.args)
        # print(request.args.get('a'))
        # print(request.args.get('a'))
        print(request.args.getlist('a')) #['a','b']
        return '获取多个get传参'

七、会话控制 cookie和session

原因: http协议是无状态的协议

cookie

    response.set_cookie(
        key, #键
        value, #值
        max_age,#以秒为单位的cookie存活时间
        expires,失效时间需要datetime的对象
        path = '/',存储的路径    
    )

实例

(1) 设置cookie

    @app.route('/set_cookie/')
    def set_cookie():
        response = make_response('设置cookie')
        response.set_cookie('name','zhangsan') #不设置存活时间 默认为当期浏览会话结束 也就是关闭当期的浏览器(并不是关闭标签页)
        response.set_cookie('name','zhangsan',max_age=10) #设置存活时间为None
        expires = time.time()+10
        response.set_cookie('name','zhangsan',expires=expires) #设置存活时间为时间戳的秒数
        return response

(2) 获取cookie request.cookies

    #获取cookie
    @app.route('/get_cookie/')
    def get_cookie():
        print(request.cookies)
        var = request.cookies.get('name','获取不到name的值')
        return '获取cookie的值为{}'.format(var)

(3) 移除cookie

    #移除cookie
    @app.route('/del_cookie/')
    def del_cookie():
        response = make_response('清除cookie')
        response.delete_cookie('name') #移除cookie的值
        expiraes = time.time()-10
        response.set_cookie('name','',expires=expires) #不设置存活时间 默认为当期浏览会话结束 也就是关闭当期的浏览器(并不是关闭标签页)
        return response

session

导入: from flask import session

cookie会每次携带着唯一的sessionId 来进行请求访问,服务端根据sessionid来区分不同用户的请求 所以session是基于cookie的 服务端会对每一个请求创建一个session对象

(1) 设置session

实例

    @app.route('/set_session/')
    def set_session():
        session['username'] = 'lisi'
        return '设置session'

(2) 设置session及session的过期时间

    @app.route('/set_session/')
    def set_session():
        session.permanent = True #设置session的持久化
        #设置session存活时间为10分钟
        #自己可以设置session时间短点 在超过时间后在获取 发现session值不再了
        app.permanent_session_lifetime = timedelta(minutes=10)

        session['username'] = 'wangwu'
        return '设置session'

(3) 获取session

    #获取session
    @app.route('/get_session/')
    def get_session():
        val = session.get('username','username值不存在')
        return '获取的seesion的值为{}'.format(val)

(4) 移除session

 #移除session
    @app.route('/del_session/')
    def del_session():
        print(session.pop('username'))
        #session.clear() #清空
        return '删除了session中username的值'

八、flask-script 扩展库

概念: 是一个flask终端运行的解析器 因为在项目完成以后 不应该有任何的改动 因为改动代码就会有风险 所以借助终端来完成不同启动项的配置

安装

pip3 install flask-script
使用

  from flask_script import Manager
  manager = Manager(app) #初始化flask运行的解析器
  manager.run()

在终端使用的启动项的可选参数

  1. -h 主机名
  2. -p 指定端口号
  3. –threaded 开启多线程
  4. -d 开启调试模式
  5. -r 代码修改后重新加载

python3 manage.py runserver [-h[,-p…]]

python3 manage.py runserver -h #查看当前都有那些可选启动项

python3 manage.py runserver -d -r -h127.0.0.1 -p5001 –threaded

九、Blueprint蓝本/蓝图

概念: 当代码越来越多的时候 所有的视图函数放在一个文件中 明显是不合理的 可以使用蓝本 将不同功能模块的视图函数 单独放在一个文件中

导入

    from flask import Blueprint,session

使用

新建一个py文件 叫user

    from flask import Blueprint
    user = Blueprint('user',__name__)
    @user.route('/login')
    def login():
        return 'login'

在manage.py中使用

 from mysession import user #导入蓝本
 app.register_blueprint(user) #app注册蓝本(将app和蓝本视图文件关联起来)
 app.register_blueprint(user,url_prefix='/user') #app注册蓝本(将app和蓝本视图文件关联起来)

十、钩子函数

类似与django 中间件 在使用的时候需要使用装饰器

在主程序中使用

钩子函数 功能描述
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(request.path)
        # print(request.method)
        if request.path=='/' and request.method=='GET':
            g.message = '不允许使用get请求index视图函数'
            abort(404)
        print('before_request')

    @app.after_request
    def after_request(r):
        print(g.message)
        print('after_request')
        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 每次请求之后 即使有异常

实例

    @mysession.before_app_first_request
    def before_first_request():
        print('before_first_request')

    @mysession.before_app_request
    def before_request():
        # print(request.path)
        # print(request.method)
        if request.path=='/' and request.method=='GET':
            g.message = '不允许使用get请求index视图函数'
            abort(404)
        print('before_request')

    @mysession.after_app_request
    def after_request(r):
        # print(g.message)
        print('after_request')
        return r

    @mysession.teardown_app_request
    def teardown_request(r):
        print('teardown_request')
        return r

随后会持续更新Flask框架的基础教程…………….看着此教程, Flask入门完全ok !


技术交流可以留言评论哦 ! 虚心学习, 不忘初心, 共同奋进 !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值