zoukankan      html  css  js  c++  java
  • Flask 快速入门

    最简单的flask程序

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    if __name__ == '__main__':
        app.run()

    外部服务器可访问

    app.run(host='0.0.0.0')

    打开调试模式

    app.debug = True
    app.run()
    
    或
    
    app.run(debug=True)

    路由

    @app.route('/hello')
    def hello():
        return 'Hello World'

    可以为函数指定多个路由

    url中添加变量

    @app.route('/user/<username>')
    def show_user_profile(username):
        # show the user profile for that user
        return 'User %s' % username
    
    @app.route('/post/<int:post_id>')
    def show_post(post_id):
        # show the post with the given id, the id is an integer
        return 'Post %d' % post_id
    int 接受整数
    float 接受浮点数
    path 和缺省情况相同,但也接受斜杠

    添加对post的支持

    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST':
            do_the_login()
        else:
            show_the_login_form()

    使用模板文件输出

    from flask import render_template
    
    @app.route('/hello/')
    @app.route('/hello/<name>')
    def hello(name=None):
        return render_template('hello.html', name=name)

     默认使用 Jinja2 模板引擎

    模板文件示例

    <!doctype html>
    <title>Hello from Flask</title>
    {% if name %}
      <h1>Hello {{ name }}!</h1>
    {% else %}
      <h1>Hello World!</h1>
    {% endif %}

    request对象

    from flask import request
    @app.route('/login', methods=['POST', 'GET'])
    def login():
        error = None
        if request.method == 'POST':
            if valid_login(request.form['username'],
                           request.form['password']):
                return log_the_user_in(request.form['username'])
            else:
                error = 'Invalid username/password'
        # 如果请求访求是 GET 或验证未通过就会执行下面的代码
        return render_template('login.html', error=error)

    获取url中的参数

    searchword = request.args.get('key', '')

    文件上传

    from flask import request
    
    @app.route('/upload', methods=['GET', 'POST'])
    def upload_file():
        if request.method == 'POST':
            f = request.files['the_file']
            f.save('/var/www/uploads/uploaded_file.txt')
        ...

    需要客户端设置enctype="multipart/form-data" 

    使用客户端的文件名保存。

    from flask import request
    from werkzeug import secure_filename
    
    @app.route('/upload', methods=['GET', 'POST'])
    def upload_file():
        if request.method == 'POST':
            f = request.files['the_file']
            f.save('/var/www/uploads/' + secure_filename(f.filename))

    使用cookie

    from flask import request
    
    @app.route('/')
    def index():
        username = request.cookies.get('username')
        # 使用 cookies.get(key) 来代替 cookies[key] ,
        # 以避免当 cookie 不存在时引发 KeyError 。

    存储cookie

    from flask import make_response
    
    @app.route('/')
    def index():
        resp = make_response(render_template(...))
        resp.set_cookie('username', 'the username')
        return resp

    使用 redirect() 函数可以重定向。使用 abort() 可以更早 退出请求,并返回错误代码:

    from flask import abort, redirect, url_for
    
    @app.route('/')
    def index():
        return redirect(url_for('login'))
    
    @app.route('/login')
    def login():
        abort(401)
        this_is_never_executed()

    定制404页面

    from flask import render_template
    
    @app.errorhandler(404)
    def page_not_found(error):
        return render_template('page_not_found.html'), 404

    make_response() 包裹返回表达式,获得响应对象,并对该对象 进行修改,然后再返回:

    @app.errorhandler(404)
    def not_found(error):
        resp = make_response(render_template('error.html'), 404)
        resp.headers['X-Something'] = 'A value'
        return resp

    使用会话

    from flask import Flask, session, redirect, url_for, escape, request
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        if 'username' in session:
            return 'Logged in as %s' % escape(session['username'])
        return 'You are not logged in'
    
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST':
            session['username'] = request.form['username']
            return redirect(url_for('index'))
        return '''
            <form action="" method="post">
                <p><input type=text name=username>
                <p><input type=submit value=Login>
            </form>
        '''
    
    @app.route('/logout')
    def logout():
        # 如果会话中有用户名就删除它。
        session.pop('username', None)
        return redirect(url_for('index'))
    
    # 设置密钥,复杂一点:
    app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

    随机生成一个秘钥

    import os
     os.urandom(24)

    记录日志

    app.logger.debug('A value for debugging')
    app.logger.warning('A warning occurred (%d apples)', 42)
    app.logger.error('An error occurred')

    flash() 用于闪现一个消息。在模板中,使用 get_flashed_messages() 来操作消息。

  • 相关阅读:
    django页面分类和继承
    django前端从数据库获取请求参数
    pycharm配置django工程
    django 应用各个py文件代码
    CF. 1428G2. Lucky Numbers(背包DP 二进制优化 贪心)
    HDU. 6566. The Hanged Man(树形背包DP DFS序 重链剖分)
    小米邀请赛 决赛. B. Rikka with Maximum Segment Sum(分治 决策单调性)
    区间树 学习笔记
    CF GYM. 102861M. Machine Gun(主席树)
    2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016) (B, D, G, H)
  • 原文地址:https://www.cnblogs.com/wuyong09/p/5688797.html
Copyright © 2011-2022 走看看