美文网首页flask
flask一、路由,请求,响应,重定向

flask一、路由,请求,响应,重定向

作者: Jason_c8d4 | 来源:发表于2018-06-06 16:29 被阅读0次

    Flask基础Part1

    Flask是一个Python实现的Web开发微框架。他与Django不同,Django是大而全面,而Flask是短小精悍。Django就好比买电脑时的一台整机,而Flask更像是一个可以自己DIY的组装机,可以跟具自己项目的需求对框架进行附加额外的模块。

    路由

    在Flask中的路由非常的简单,只需要把一个函数绑定到route()装饰器上,并将URL传递进去。

    @app.route('/')
    def index():
        return 'Index Page'
    
    @app.route('/hello')
    def hello():
        return 'Hello world'
    

    路由中的变量规则

    有时候需要接收URL中的参数变量,可以把参数标记为一个变量<变量名>,这个部分将会作为命名参数传递给函数。同时还可以限制参数变量的类型<类型:变量名>

    @app.route('/user/<username>')
    def show_user_info(username):
        # 进行数据查询的代码
        return 'User %s' % username
    
    @app.route('/post/<int:aritle_id>')
    def show_article(aritle_id):
        # 进行数据查询的代码
        return 'Aritle ID : %s' % aritle_id
    

    数据类型一共有三种:int, float, path

    类型 描述
    int 接受整数
    float 同 int ,但是接受浮点数
    path 和默认的相似,但也接受斜线

    注意

    路由一定要写规范,不规范的URL路由会导致额外的404错误。

    例如:

    @app.route('/projects/')
    def projects():
        return 'The project page'
    
    @app.route('/about')
    def about():
        return 'The about page'
    

    当访问projects时,使用规范的URL地址http://127.0.0.1/projects/能够正常的访问,而使用http://127.0.0.1/projects时Flask会自动的重定向到规范的URL地址。

    当访问about时,使用不规范的URL地址http://127.0.0.1/about能正常访问,但是当使用规范的URL地址http://127.0.0.1/about/进行访问时就会报404错误。

    生成URL

    既然Flask能匹配URL自然也能够生成对应的URL。这需要使用到url_for()方法。

    from Flask import Falsk, url_for
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        print(url_for('index'))
        print(url_for('do_login', name='TengTengCai'))
        print(url_for('get_user', user_id='1234'))
        print(url_for('get_grade', grade_id='0987'))
        return 'Index Page'
    
    @app.route('/login/')
    def do_login():
        return 'Login Method'
    
    @app.route('/user/<user_id>/')
    def get_user(user_id):
        return 'User ID is %s' % str(user_id)
    
    @app.route('/grade/<int:grade_id>/')
    def get_grade(grade_id):
        return 'Grade ID is %s type is %s' % (str(grade_id), type(grade_id))
    

    通过python app.py启动服务器,通过访问根路径查看输出结果。

    /
    /login/?name=TengTengCai
    /user/1234/
    /grade/0987/
    

    模版渲染

    Flask和Django一样都配备了Jinja2模版引擎,可以使用render_template()方法来渲染模版。

    目录结构

    │  app.py
    ├─static
    └─templates
            index.html
    

    app.py

    from flask import render_template, Flask, Manager
    
    app = Flask(__name__)
    
    manager = Manager(app)
    
    @app.route('/index/')
    @app.route('/index/<name>/')
    def index(name=''):
        return render_template('index.html',name=name )
    
    if __name__ == '__main__':
        manager.run()
    

    index.html模版文件, 使用jinja2模版渲染,将名字显示在模版html文件中,加载静态文件。

    模版文件(templates)和静态文件(statics)的目录访问,默认于app.py属于同级目录,如果目录地址发生改变,需要进行设置。(设置路径会在后面的蓝图(blueprints)讲到)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Index</title>
        <link type="text/css" rel="stylesheet" href="/static/css/style.css">
    </head>
    <body>
        <h1>欢迎用户 {{ name }}</h1>
    </body>
    </html>
    

    style.css文件

    * {
        margin: 0;
        padding: 0;
    }
    h1 {
        color: lightgreen;
    }
    

    启动服务,访问http://127.0.0.1:5000/index/TengTengCai/

    访问index页面

    请求(request)

    request请求,在使用请求之前需要从Flask中导入它。

    from flask import request
    

    当前请求的HTTP方法可以通过method属性来获取。

    GET方法中的参数可以通过request.args.get(key, default)来获取

    POST方法中的参数可以通过request.form.get(key, default)来获取

    如果请求中存在文件则可以通过files属性来获取Python中的file对象

    @app.route('/UserInfo/', methods=['POST', 'GET'])
    def get_user():
        if request.method == 'GET':
            args = request.args
            name = args.get('name', '')  # 如果name参数只有一个可使用get
            names = args.getlist('name')  # 如果name参数有多个可使用getlist,返回一个list
        elif rqeuest.method == 'POST':
            name = request.form.get('name')  # 如果name参数表单中只有一个可使用get
            names = request.form.getlist('name')  # 如果name参数表单中有多个可使用getlist,返回一个list
            my_files = request.files['my_file']
            my_files.save('filename')  # 存储的文件路径和名称
        else:
            return 'error'
        return 'Name is %s, Names is %s' % (name, str(names))
    

    响应(response)

    视图函数的返回值会被自动转换为一个响应对象。如果返回值是一个字符串,它会被转换为该字符串为主体的、状态码为200 OK的MIME类型是test/html的响应对象。

    Flask把返回值转换为响应对象的过程:

    1. 如果返回的是一个正确的响应对象,它会从视图直接返回。
    2. 如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
    3. 如果返回的是一个元组,且元组中的元素可以提供额外的信息。这样的元组必须是(response, status, headers)的形式, 且至少包含一个元素。status值会覆盖状态代码,headers可以是一个列表或字典,作为额外的消息标头值。
    4. 如果上述条件均不满足,Flask会假设返回值是一个合法的WSGI应用程序,并转化为一个请求对象。(所以经常会看到关于WSGI的代码报错,实则是response响应出错了)

    在视图中可以使用make_response()函数。使用前需要导入对应模块

    from flask import make_response
    
    @app.route(/myResponse/)
    def get_response():
        resp = make_response(render_template('test.html'), 200)  # 生成一个新的response对象
        return resp  # 返回response对象
    

    重定向和错误(redirect,error)

    我们可以使用redirect()函数把用户重定向到其他地方。放弃请求并返回错误代码,用abort()函数。

    from flask import abort, redirect, url_for, render_template
    
    @app.route('/')  # 主页的路由
    def index():
        return redirect(url_for('login'))  # 重定向到login方法
    
    @app.route('/login/')  # login的路由
    def login():  
        abort(404)  # 抛出错误,终止运行
        return 'error'
    
    @app.errorhandler(404)  # 获取到404错误
    def page_not_found(error):
        return render_template('page_not_found.html'), 404  # 返回404页面,状态码为404
    

    默认情况下,错误代码会显示一个黑白的错误页面,如果要定制,则可以使用errorhandler()装饰器

    相关文章

      网友评论

        本文标题:flask一、路由,请求,响应,重定向

        本文链接:https://www.haomeiwen.com/subject/jdabsftx.html