flask基础一

Flask基础

首先安装好flask1.0

服务器与框架的关系

服务器与框架之间实际上就是一个分离而结合的关系,服务器运行的时候,所有客户端请求的信息都是通过服务器进行通信,并没有直接给框架,服务器接收信息之后如果是静态内容则直接返回出去,如果是动态的内容,服务器是没有能力进行处理的,这个时候服务器就会通过wsgi接口把客户端的请求信息发送给框架,框架从接口处接收到信息进行对应的处理之后返回响应内容给服务器,再由服务器进行返回给客户端.整个过程服务器就充当了一个中间角色.

flask框架之所以叫做轻框架实质在于其结合比较松散,不像django那样非常闭合,flask提供了很多调用其他包的接口,这种好处在于当我需要的时候我才去使用,我不需要的时候我可以只使用里面的一部分功能.django就像是一个你买的笔记本电脑,里面的硬盘,cpu什么的已经有了,也许你不需要使用光驱,单是别人就是已经成套的卖给你,没办法,而flask就像自己买组装机,主板,内存条什么的都是需要的时候在买

flask基本代码

首先必须导包

from flask import Flask

这个意思是导入flask模块中的Flask类,导入类之后很容易想到的就是实例化

app = Flask(__name__)

这里源码中就需要传递一个参数,源码中的参数名字为import_name意思导入的名字,这个自己编写的flask代码必然会受到执行的py文件的导入,那么在导入的时候我怎么知道执行的py文件叫啥名字,因此,这里就使用(name)这个变量,这个变量的好处在于谁导入,那么变量值就是谁,自己运行的时候就是main,作为文件被导入的时候就是py文件名

路由的绑定

# 构建试图函数 装饰视图函数的两种方式之一就是直接使用装饰器 '/'这就表示根目录
@app.route('/') # 装饰器前面的就是创建的Flask对象名 第一个参数是rule:表示从浏览器里面输入的信息
def index():
    return 'OK !!!'

可以叫绑定,也可以叫注册,内在的实质就是将这个函数注册到一个表中,以后服务器接收到请求后将信息传给框架,框架就开始在这个表中找,如果信息与表中的映射关系相匹配,则就执行函数并返回值,如果没有找到,那就GG,直接404

上面这个装饰器有点意思,装饰器的名字app其实就是前面的实例化对象名,后面的route其实是一个函数,这种实现是这个框架里面实现的,点开route源码就会发现,这个装饰器的实质其实是调用的了一个add_url_rule函数,参数都是传给这个函数的,实际上存在5个参数

    @setupmethod
    def add_url_rule(self, rule, endpoint=None, view_func=None,
                     provide_automatic_options=None, **options):

上面是源码,源码中存在四个必填的参数,第一个跟装饰器一样,第二个就是为了反向路由的时候而设置的,相当于别名,第三个就是绑定的函数名,在装饰器中不用填的原因在于被装饰的函数会直接传进去,这里如果使用的是这个方法的话则需要进行手动传入

# 通过查看源码可以发现这个装饰器内部实际上执行的是add_url_rule方法,而且这个方法同样是定义在类下面的方法,因此类实例化的app对象应该能够直接调用这个方法
def show():
    return 'use add_url_rule function 中文不乱码'
# 源码中的必填参数已经填写完成,endpoint用于在反向解析的时候使用的别名,实际跟django中的路由后面命名的别名是一样的效果,view_func就是需要绑定的视图函数,这个跟django中绑定视图是一样的
app.add_url_rule('/show/', endpoint=None, view_func=show)

最后直接进行启动就行了

app.run()

响应内容

当函数在运行之后,代码进行相关的执行并返回需要响应的结果,这就需要深入的看返回值的设置,当没有设置的时候,只返回的是字符串,那么实际上框架内部已经默认好了响应头,并且告诉浏览器以html格式进行解析

from flask import Flask, make_response
import json
app = Flask(__name__)


# 进行函数定义
@app.route('/')
def index():
    return 'response information', 200, {'Content-type': 'text/html'}


@app.route('/show/')
def show():
    # 构建响应对象 响应内容,状态码,响应头
    json_obj = json.dumps({"show1":{"num1": 1},"show2":{"num2":2}})
    res = make_response(json_obj, 200, {'Content-type': 'text/json', 'mycontent': 'anything'})
    # 也可以像字典一样的添加
    res.headers['insert_information'] = 'new_information'
    return res
    # 响应的头文件:
    # HTTP/1.0 200 OK
    # Content-type: text/json
    # mycontent: anything
    # Content-Length: 40
    # insert_information: new_information
    # Server: Werkzeug/0.14.1 Python/3.6.5
    # Date: Tue, 25 Dec 2018 09:33:15 GMT


if __name__ == '__main__':
    app.run()

实际上响应参数是一个元组,有三个参数,返回的直接就是make_response对象,也可以通过直接设置response对象,这里手动的改成响应的是json格式,以后进行响应ajax的时候经常返回的就是这种格式

请求参数

参数的截取比较常见,有的时候其实就是在地址栏中进行id的传输等等,flask提供了这样的方式,在绑定的时候提供一个转换器,进行过滤

from flask import Flask

app = Flask(__name__)


# 在装饰器上直接进行浏览器输入的地址栏信息截取
@app.route('/show/<some_num>/')
def show(some_num):
    return f'截取的信息是:{some_num}'
# 可以进行指定方式进行传输,相当于先对参数进行过滤
@app.route('/index/<int:num>/') # 截取的时候如果不写默认就是string
def index(num):
    return f'计算结果为{num**2}'
@app.route('/new/<path:location>')
def shadow(location):
    return f'截取地址{location}'

if __name__ == '__main__':
    print(app.url_map) # 可以进行查看已经绑定成功的路由
    app.run()

在flask中还存在一个request对象,这个对象上放着从浏览器提交过来的表单,请求头,以及很多信息,相当于django中的request一样,可以直接从上面获得对应的参数

下面使用代码,设计一个登陆页面和一个注册页面,非常简陋,基本把对应的方法都用上了

from flask import Flask, render_template, request, make_response

app = Flask(__name__)

data = {'new': '123456'}
# 定义登录页面
@app.route('/login/', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        # 从提交的表单中获取对应的信息
        username = request.form.get('username', None)
        pwd = request.form.get('pwd', None)
        # 进行信息判断
        if data.get(f'{username}') == pwd: # 判定是否存在用户
            # 表示验证成功 登录成功后进行对应的cookie设置
            # 获取页面
            t = render_template('index.html', username=username)
            res = make_response(t)
            # 设置cookie
            res.set_cookie('username',f'{username}', max_age=600) # 10分钟
            return res
        else:
            return '用户名或密码错误'
    else:
        # 表示使用的是get请求
        html = render_template('login.html')
        return html

# 进行注册页面写入
@app.route('/register/', methods=['GET', 'POST'])
def register():
    global data
    if request.method == "POST":
        # 从表单里面拿数据
        username = request.form.get('username', None)
        pwd = request.form.get('pwd', None)
        # 拿到数据之后进行写进字典
        data[f'{username}'] = pwd
        return '注册成功'
    else:
        # 如果是GET方式,则显示页面
        t = render_template('register.html')
        # 返回页面
        return t

@app.route('/index/')
def index():
    # 首页需要展示的是页面并携带信息
    username = '你还没有登录'
    t = render_template('index.html', username=username)

if __name__ == '__main__':
    app.run()

装饰器上面如果只写路径则默认就是GET方法请求,如果需要进行写POST请求方法,则直接在后面添加参数,这里还没有写入数据库,所以直接就进行字典中存储的方式

注意到render_template的方式记性导入模板,和django中的导入类似,但是这里需要注意到的是在执行的py文件同级目录下需要建立一个名字为templates的文件,文件名必须是templates,里面就放模板文件,如果有静态文件,比如css或者js,则放在同级目录下建立一个static文件,文件名必须是static.原因在于源码里面已经写了是这个,那就只能这么写.

t = render_template('index.html', username=username)

这里当做关键字参数传入,实际上是因为我在index模板中定义了{{username}}这个变量,那么flask框架会自动解析到这个变量,那么这个变量的值就是这里传进去的值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值