Flask框架--1(视图及路由)

一.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存储方式指定

二.虚拟环境

1.为什么要搭建虚拟环境?

作用:虚拟环境可以搭建独立的python运行环境,使得单个项目的运行环境与其他项目互不影响

          在开发过程中,当需要使用python的某些工具包/框架时需要联网安装

2 .安装Flask框架 flask-0.10.1版本

    sudo pip install flask ==0.10.1

3.如何搭建虚拟环境

    在python3中,创建虚拟环境

    mkvirtualenv  -p python3 虚拟环境名字

    例如 :

    mkvirtualenv  -p  python3  py3_flask

4.如何使用虚拟环境?

    查看虚拟环境的命令

    wokon  两次tab键

    使用虚拟环境的命令

    workon  py3_flask

    退出虚拟环境

    deactivate

    删除虚拟环境

    rmvirtualenv 虚拟环境名称

    查看虚拟环境中安装的包

    pip freeze

三.创建一个简单的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/')

    def user_info(user_id)

        return 'hello %s'  % user_id

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

    

    @app.route('/user/')

     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/')

    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

六.转换器

1.什么叫转换器?

定义url的匹配规则的一个对象

2.正则匹配路由

在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问

具体步骤为:

    (1).导入转换器基类:在Flask中,所有的路由的匹配规则都是使用转换器对象进行记录

    (2).自定义转换器:自定义类继承于转换器基类

    (3).添加转化器到默认的转换器字典中

    (4).使用自定义转换器实现自定义匹配规则

3.系统自带转换器

DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

七.异常捕获

HTTP异常主动抛出

abort方法

abort(500

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

八.请求钩子

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

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

    before_first_request    在请求第一个请求前执行

    before_request    在每次请求前执行    如果在某修饰的函数中返回了一个响应,视图函数将不再被调用

    after_request    如果没有抛出错误,在每次请求后执行

    teardown_request    在每次请求后执行

九.装饰器路由具体实现

1.Flask有两大核心:

    Werkzeug和Jinja2

    -Werkzeug 实现路由,调试和Web服务器网关接口

    -Jinja2实现了模板

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

    

 其内部实现了很多Web框架底层的东西,比如request和response对象;
- 与WSGI规范的兼容;支持Unicode;
- 支持基本的会话管理和签名Cookie;
- 集成URL请求路由等。
   
    Werkzeug库的 routing 模块负责实现 URL 解析。不同的 URL 对应不同的视图函数,routing模块会对请求信息的URL进行解 析,匹配到URL对应的视图函数,执行该函数以此生成一个响应信息。


3.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

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

1.1Cookie运行原理

Flask框架--1(视图及路由)_第1张图片

1.2设置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
1.3设置过期时间

@app.route('/cookie')
def set_cookie():
    response = make_response('hello world')
    response.set_cookie('username', 'itheima', max_age=3600)
    return response

1.4获取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

2.1Session运行原理

Flask框架--1(视图及路由)_第2张图片

2.2session数据的获取

@app.route('/index1')
def index1():
    session['username'] = 'laowang'
    return redirect(url_for('index'))
@app.route('/')
def index():
    return session.get('username')

十二.上下文

current_app
g变量


两者区别:

请求上下文:保存了客户端和服务器交互的数据

应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等

十三.Flask-Script

通过使用Flask-Script扩展,我们可以在Flask服务器启动的时候,通过命令行的方式传入参数。而不仅仅通过app.run()方法中传参,比如我们可以通过:

python hello.py runserver -host ip地址

代码实现

安装 Flask-Script扩展

pip install flask-script

集成 Flask-Script

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
# 把 Manager 类和应用程序实例进行关联
manager = Manager(app)

@app.route('/')
def index():
    return '床前明月光'

if __name__ == "__main__":
    manager.run()
未完待续......

你可能感兴趣的:(Flask框架--1(视图及路由))