Flask基础之视图-01

Flask是基于Python语言编写的一种轻量级的Web框架

Python最出名的框架要数Django,此外还有Flask,Tornado

Django与Flask相比,DJnao就像精装修好的房子,功能比较全面,集成了MVT

ORM后台站点管理,但是缺点也非常的明显,什么都得按照Django规定的去做。而

Flask不一样,Flask比较轻量简洁,有很多第三方的扩展包,需要什么就拿什么,比较

灵活,这也是Flask受欢迎的原因

比如Flask的一些扩展包:

  • Flask-SQLalchemy:操作数据库;
  • Flask-migrate:管理迁移数据库;
  • Flask-Mail:邮件;
  • Flask-WTF:表单;
  • Flask-script:插入脚本
  • Flask-Login:认证用户状态;
  • Flask-RESTful:开发REST API的工具;
  • Flask-Bootstrap:继承前端Twitter Boostarp矿浆;
  • Flask-Moment:本地日期华时间;

Flask程序运行的过程:

所有Flask程序必须有一个程序实例

Flask调用视图函数后,会将函数的返回值作为响应的内容,返回给客户端。一般情况下,响应内容主要是字符串和状态码

当客户端想要获取资源时,一般会发送HTTP请求。此时,web服务器使用WSGI协议,把来自客户端的所有请求都交给Flask程序实例WSGI是为Python语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口,他封装了接收HTTP请求解析HTTP请求发送HTTP响应等等的这些底层的代码和操作,可以快速开发

程序实例使用Werkzeug来路由的分发(URL请求和视图函数之间的对应关系)。根据每个URL请求,找到具体的视图函数。在Flask程序中,路由的实现都是通过程序实例的route装饰器,route装饰器使用add_url_route()方法实现路由的注册。

调用视图函数,获取响应数据后,把数据传入HTML模板文件中,模板引擎负责渲染数据,然后响应数据给浏览器。

# coding=utf-8
from flask import Flask, abort,make_response,request,current_app  # 导入flask类
from settings import Config  # 导入配置文件
from werkzeug.routing import BaseConverter

使用Flask 必须使用Flask类创建一个falsk程序实例对象
第一个参数接收包或者模块的名字作为参数,但一般都是传递name
flask.helpers.get_root_path函数通过传入的这个名字来确定你程序的根目录,以便获取到静态文件和模板文件的目录
name参数的作用,是为了确定程序所在的位置
Flask会默认创建静态路由
创建Flask程序的实例对象时,第一个参数名只能是字符串,不能使用数值,如果传入的字符串为python内置模块名,默认的静态路由是找不到的

app = Flask(__name__)

配置对象,可以导入具体配置文件

app.config.from_object(Config)

使用装饰器将路由映射到视图函数的index

@app.route('/n')
def index():
    return 'hello word'
    有时需要将同一类URL映射到同一个视图函数,
    比如:使用同一个视图函数来显示不同用户的个人信息
    路由传递的参数默认会当做字符串来处理,这里指定int类型,获取每个用户的id,尖括号中冒号后面的内容是动态的
@app.route('/user/<int:id>')
        def user_info(id):
        return 'hello itcast %s' % id
使用`abort函数`可以返回一个`http标准中存在的错误状态码`
如果在函数执行的过程中出现了异常可以使用abort`立即终止函数视图的执行
@app.route('/test/abort')
def test_about():
abort(404)
return 'hello itcast'

自定义转换器 内置转换器只可以限制数据类型不能限制数据的长度等,所以需要自定义转换器
    class Refex(BaseConverter):
        # regex = '[0-9]{4}'
        def __init__(self, map, *args):
            super(Refex, self).__init__(map)
            self.regex = args[0]
            print 'map',map
            print '---', args[0]

添加转化器的映射

    app.url_map.converters['re'] = Refex
    @app.route('/<re("[0-9]{4}"):num>')
    def demo_refex(num):
        return '%s' % num

优化静态文件的访问路径
使用响应对象,make_response,current_app把指定的文件发送给浏览器
自定义转换器,实现静态文件的优化
class Static_Path(BaseConverter):

    def __init__(self,map,*args):
        super(Static_Path, self).__init__(map)
        self.regex = args[0]

添加转化器的映射

app.url_map.converters['static_path'] = Static_Path

定义路由访问静态页面

@app.route('/<static_path(".*"):filename>')
def StaticPate(filename):
    if not filename:
        filename = 'index.html'
    else:
        filename = 'html/' + filename
    resp = make_response(current_app.send_static_file(filename))
    return resp

状态保持:因为http是无状态的,http使用的是tcp/ip协议,每次连接都要创建socket连接,都要通过三次握手四次挥手,他并不会记住你上一次是不是访问过
web应用需要保持某种状态,cookie的本质是字典

 设置cookie
@app.route('/setcookie')
def SetCookie():
    resp = make_response('set cookies success')
    resp.set_cookie('user','python23',max_age=300)
    return resp

获取cookie

@app.route('/getcookie')
def GetCookie():
    resp = request.cookies.get('user')
    return resp

启动web服务器:

if __name__ == '__main__':
 `查看视图函数中的路由映射`
print(app.url_map)
app.run()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值