flask入门(二)

1.路由

使用route()装饰器把一个函数绑定到URL上,可以动态的构造URL的特定部分,也可在一个函数上附加多个规则

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

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

2.变量规则

给URL添加变量部分,这部分作为命名参数传递到函数。规则可用指定转换器

@app.route('/user/')
def show_user_profile(username):
  return 'User %s' %username

@app.route('/post/')
def show_post(post_id):
  return 'Post %d' %post_id
转换器 接受参数
string 接受任何没有斜杠“/”文本(默认)
int 整型
float 同int一样,但是还包括浮点数
path 和string相似,但也接受斜杠“/”
uuid 只接受UUID字符串
any 可以制定多种路径,但是需要传递参数

@app.route('//') 访问/a/和/b/都符合这个规则,page_name对应的就是a或b。

3.唯一URL和重定向行为

以下两个为例:

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

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

它们结尾斜线的使用在 URL 定义 中不同。 第一种情况中,指向 projects 的规范 URL 尾端有一个斜线。这种感觉很像在文件系统中的文件夹。访问一个结尾不带斜线的 URL 会被 Flask 重定向到带斜线的规范 URL 去。

然而,第二种情况的 URL 结尾不带斜线,类似 UNIX-like 系统下的文件的路径名。访问结尾带斜线的 URL 会产生一个 404 “Not Found” 错误。

4.构造URL

url_for()可以给指定的函数构造URL。
接受函数名作为第一个参数,也接受对应URL规则的变量部分的命名参数。未知变量会添加到URL末尾作为查询参数。

flask入门(二)_第1张图片
图片发自App

环境局部变量
一段依赖请求对象的代码,因没有请求对象而无法运行。
解决方案:自行创建一个请求对象,并绑定到环境中。单元测试中最简单的使用 test_request_context()环境管理器

from flask import request
with app.test_request_context('/hello',method='POST'):
  assert request.method=='POST'
  assert request.path=='/hello'

另外一种可能,传递整个WSGI环境request_context()方法

from flask import request
with app.request_context(environ):
  assert request.method=='POST'

5.重定向和错误

redirect(location,code=301)函数把用户重新定向到其他地方,和url_for()结合使用。abort()放弃请求并返回错误码

from flask import abort,url_for,redirect

@app.route('/')
def index():
  retuen redirect(url_for('login'))

@app.route('/login')
def login():
  abort(401)
  this_is_never_execute()

定制错误页面,使用errorhandler()装饰器

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

实例

from flask import Flask,request,redirect,abort,url_for,render_template

app=Flask(__name__)
app.config.from_object("config")

@app.route('/people/')
def people():
    name=request.args.get("name")
    if not name:
        return redirect(url_for("login"))
    user_agent=request.headers.get("User-Agent")
    return "Name:{0};UA:{1}".format(name,user_agent)

@app.route('/login/',methods=["GET","POST"])
def login():
    if request.method=="POST":
        user_id=request.form.get("user_id")
        return "User:{} login".format(user_id)
    else:
        return render_template('login.html')

@app.route('/secret/')
def secret():
    abort(401)
    print('This is never execute!')

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

login.html




    
    
    登录


    
用户名
密码

你可能感兴趣的:(flask入门(二))