Flask框架(1)-程序基本结构

1. 安装Flask

1.1 安装虚拟环境html

mkdir myproject
cd myproject
py -3 -m venv venv
#Linux系统: python3 -m venv venv

 1.2 激活虚拟环境python

venv\Scripts\activate
#Linux中: . venv/bin/activate

 1.3 安装Flask数据库

(venv) D:\Tmp\myproject>pip install Flask
2. 第一个Flask程序
from flask import Flask

app = Flask(__name__)

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

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

 

初始化:app = Flask(__name__)flask

  Flask类只须要有个构造参数即主模块或包的名字,这个参数决定程序的根目录,以便找到相对于根目录的资源文件,这个大部分状况__name__就是所须要的值。api

 路由:@app.route('/')安全

  处理函数和和URL的关系,Flask经过修饰器把函数注册为路由。访问http://localhost:5000就会调用index这个视图函数  cookie

访问:http://127.0.0.1:5000,页面便可获得hello world.app

 

 默认只能本机访问,能够修改端口和容许的主机:app.run(host = '0.0.0.0',port = 7777,debug = True )函数

 3.上下文

   Flask有程序上下文和请求两种上下文,Flask使用上下文把一些对象设置为在一个线程内全局可访问。this

Flask在分发请求以前,激活或者说推送程序和请求上下文,请求处理完后进行删除。注意必定要激活才可使用上下文。

4. 请求调度

   查看URL和处理函数的映射关系:

  这里有一个特殊的映射关系/static/<filename>,这是Flask添加的特殊路由,用于访问静态文件。url_for('static', username='js/test.js')

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return 'index'

@app.route('/login')
def login():
    return 'login'

@app.route('/user/<username>')
def profile(username):
    return '{}\'s profile'.format(username)

with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))

/
/login
/login?next=/
/user/John%20Doe
5. 请求钩子

   钩子用于处理请求以前或者以后,好比说请求开始前创建数据库链接,Flask支持下面四种钩子:

6. 响应

6.1 响应状态码

@app.route('/')
def index():
    return '<h1>Hello World!</h1>',400

 

6.2  返回respones对象

@app.route('/')
def index():
    response = app.make_response('<h1>This document carries a cookie</h1>')
    response.set_cookie('name', 'scott')
    return response

 

6.3 重定向

from flask import redirect
app = Flask(__name__)

@app.route('/')
def red():
    return redirect('https://www.baidu.com')

 

6.4 abort函数处理错误

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed() 
7. 渲染模板

从Python内部生成HTML并很差玩,并且实际上很是麻烦,由于您必须自行执行HTML转义以保持应用程序的安全。由于Flask 自动为你配置Jinja2模板引擎。

要呈现模板,您可使用该render_template() 方法。您所要作的就是提供模板的名称以及想要做为关键字参数传递给模板引擎的变量。如下是如何呈现模板的简单示例:

from flask import render_template

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

 

8. HTTP方法

根据不一样的请求方法,执行不一样的方法。

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()
9. 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'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template('login.html', error=error)

 

要访问在URL(?key=value)中提交的参数,您可使用 args属性:

searchword = request.args.get('key', '')
10. 文件上传 
from flask import request
from werkzeug.utils 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))  
相关文章
相关标签/搜索