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

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()装饰器

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容