[741]Flask框架(视图及路由)

一.Web框架

1.什么是Web框架?

协助开发者快速开发Web应用程序的一套功能代码

2.为什么要用Web框架?

稳定性和可扩展性强
可以降低开发难度,提高开发效率
总结一句话:避免重复造轮子

3.在Python中常用的Web框架有

flask   
django   
tornado

4.Flask框架的核心

werkzeug(路由模块)
Jinja2(模板引擎)

5.Flask常用扩展包

Flask-SQLalchemy:操作数据库
Flask-script:插入脚本
Flask-migrate:管理迁移数据库
Flask-Session:Session存储方式指定

二.创建一个简单的hello world程序

#导入Flask
from flask import Flask

#创建Flask的应用程序
app= Flask(__name__)
#使用装饰器路由去与视图函数进行关联
@app.route('/')
def index():
    return 'hello world!'

if __name__=='__main__'
    #运行当前Flask应用程序
    app.run()

三.Flask创建时候的参数

第一个参数指代Flask所对应的模板,其实可以决定静态文件从哪个位置开始找

app = Flask(__name__ ,
           #static_url_path ='/static' #表示静态文件访问的路径
           static_url_path = '/python27'
           static_folder ='static'    #表示静态文件所存放在目录,默认值是static\
           template_folder='template' #表示模板文件存放的目录
           )

1.给路由传参示例

1.1 有时我们需要将同一类 URL映射到同一个视图函数处理,:比如:使用同一个视图函数来显示不同用户的个人信息

@app.route('/user/<user_id>')
def user_info(user_id)
    return 'hello %s'  % user_id

1.2 路由传递的参数默认当作string处理,也可以指定参数的类型

@app.route('/user/<int:user_id>')
def user_info(user_id)
    return 'hello %s'  % user_id

2.请求指定方式

在Flask中,定义一个路由,默认的请求方式为:

GET
OPTIONS(自带)
HEAD(自带)

如果想添加请求方式.那么可以如下指定

@app.route('/demo2',methods=['GET','POST'])
def demo2():
    #直接从请求中取到请求方式并返回
    return request.method

四.视图常用逻辑

1.返回Json

在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应

@app.route('/demo4')
def demo4():
    json_dict = {
        "user_id" : 10,
        "user_name" : "laowang"
    }    
    return jsonify(json_dict)

2.重定向

2.1重定向到 百度官网

@app.route('/demo5')
def demo5():
    return redirect('http://www/baidu.com')

2.2 重定向到自己写的视图函数

@app.route('/demo1')
def demo1():
    return 'demo1'

#重定向
@app.route('/demo5')
def demo5():
    return redirect(url_for('demo1'))

2.3 重定向到带有参数的视图函数

在 url_for 函数中传入参数

@app.route('/user/<int:user_id>')
def user_info(user_id):
    return   'hello  %d'  % user_id

#重定向
@app.route('/demo5')
def demo5():
    #    使用 url_for 生成指定视图函数所对应的 url
    return redirect(url_for('user_info',user_id=100))

3.返回自定义的状态码

@app.route('/demo6')
def demo6():
    return '状态吗为666',666

五.异常捕获

HTTP异常主动抛出

abort方法
abort(500)

#使用装饰器的形式去捕获指定的错误码和异常
@app.errorhandler(404)
def page_not_found(error):
	return	'咦,页面不见了'

六.请求钩子

为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

before_first_request:在请求第一个请求前执行
before_request:在每次请求前执行    如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
after_request:如果没有抛出错误,在每次请求后执行
teardown_request:在每次请求后执行

七.装饰器路由具体实现

Flask有两大核心:

Werkzeug和Jinja2

  • Werkzeug 实现路由,调试和Web服务器网关接口
  • Jinja2实现了模板

Werkzeug是一个遵循WSGI协议的python函数库

其内部实现了很多Web框架底层的东西,比如request和response对象;

  • 与WSGI规范的兼容;支持Unicode;
  • 支持基本的会话管理和签名Cookie;
  • 集成URL请求路由等。
       
    Werkzeug库的 routing 模块负责实现 URL 解析。不同的 URL 对应不同的视图函数,routing模块会对请求信息的URL进行解 析,匹配到URL对应的视图函数,执行该函数以此生成一个响应信息。

routing模块内部有:

Rule类:用来构造不同的URL模式的对象,路由URL规则
Map类:存储所有的URL规则和一些配置参数
BaseConverter的子类:负责定义匹配规则
MapAdapter类:负责协调Rule做具体的匹配的工作

八. request

属性说明类型
data记录请求的数据,并转换为字符串*
form记录请求中的表单数据MultiDict
args记录请求中的查询参数MultiDict
cookies记录请求中的cookie信息Dict
headers记录请求中的报文头EnvironHeaders
method记录请求使用的HTTP方法GET/POST
url记录请求的URL地址string
files记录请求上传的文件*

示例  :  获取上传的图片并保存到本地

@app.route('/', methods=['POST'])
def index():
    pic = request.files.get('pic')
    pic.save('./static/aaa.png')
    return 'index'

九.状态保持

因为http 是一种无状态协议,浏览器请求服务器是无状态的。

  • 无状态:

指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。

  • 无状态原因:

浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象

实现状态保持主要有两种方式:

在客户端存储信息使用:cookie
在服务器端存储信息使用:session

1.Cookie

某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。

  • Cookie运行原理

image.png

  • 设置cookie
from flask imoprt Flask,make_response

@app.route('/cookie')
def set_cookie():
    resp = make_response('this is to set cookie')
    resp.set_cookie('username', 'itcast')
    return resp
  • 设置过期时间
@app.route('/cookie')
def set_cookie():
    response = make_response('hello world')
    response.set_cookie('username', 'itheima', max_age=3600)
    return response
  • 获取cookie
from flask import Flask,request

#获取cookie
@app.route('/request')
def resp_cookie():
    resp = request.cookies.get('username')
    return resp

2.Session

对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息

在服务端进行状态保持的方案就是Session

Session依赖于Cookie

  • Session运行原理

image.png

  • session数据的获取
@app.route('/index1')
def index1():
    session['username'] = 'laowang'
    return redirect(url_for('index'))

@app.route('/')
def index():
    return session.get('username')

来源:https://blog.csdn.net/sober333/article/details/80117571

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值