Project name :Flask_Plan
templates:templates
static:static
@app.route('/') def hello_world(): return 'index default'
直接get访问域名 http://127.0.0.1:5000
@app.route('/view_plan/') def view_plan(): return render_template('plan.html') # 此行修改
get访问子目录 http://127.0.0.1:5000/view_plan
@app.route('/view_date/<date>') # 增加<date>
def view_date(date): # 把date传入显示函数
print(date)
return render_template('plan.html')
get访问子目录,带参数 http://127.0.0.1:5000/view_date/20171212
后台会打印20171212
曾经让我冥思苦想2天的一个问题是:
上面3个路由和视图函数都写好了
http://127.0.0.1:5000/view_date/20171212
http://127.0.0.1:5000/view_plan
可以正常访问
http://127.0.0.1:5000/view_plan/20121212
http://127.0.0.1:5000/view_date/
直接404错误
如何使404错误的可以正常访问呢?
使用request。
from flask import Flask, render_template ,request
首先引入request
@app.route('/view_plan/') def view_plan(): date = request.args.get('date') print(date) return render_template('plan.html') # 此行修改 # 历史计划的查询,输入日期,即可显示历史日期的计划 @app.route('/view_date/') # 增加<date> def view_date(): # 把date传入显示函数 date = request.args.get('date') print(date) return render_template('plan.html') # 此行修改
然后修改视图函数。
访问的时候这样:
http://127.0.0.1:5000/view_plan/
http://127.0.0.1:5000/view_date/
都是正常访问。
http://127.0.0.1:5000/view_plan/?date=20171212
http://127.0.0.1:5000/view_date/?date=20171212
也可以正常访问了。多个参数可以用&连起来
http://127.0.0.1:5000/view_date/?date=20171212&carriage=552828
后台:
request.args.get(date)
request.args.get(carriage)
这样的地址看起来就像是动态地址。
想使用静态地址方式的方法有以下两种:
一:建立两条路由,视图函数引用。
@app.route('/hello/')
def hello(name='jack'):
return 'hello %s'%name
@app.route('/hello/<name>')
def helloname(name):
return hello(name)
访问 http://domain.com/hello 则使用视图函数hello,并将name设一个默认值jack
访问 http://domain.com/hello/rose 则使用视图函数 helloname,实际是使用hello函数
一:使用路由的default参数:
@app.route('/', defaults={'name': 'jack'}) @app.route('/<name>') def hello_world(name): return 'hello %s'%name
两个路由装饰器,
看着应该是使用 ‘/<name>’,如果name没有提供,那么就使用默认值:jack
二:使flask路由解析支持正则表达式。
另一种解法:给flask的url路由增加正则功能。
from flask import Flask, render_template ,request from werkzeug.routing import BaseConverter #此行新增 app = Flask(__name__) class RegexConverter(BaseConverter): #此函数新增 def __init__(self, url_map, *items): super(RegexConverter, self).__init__(url_map) self.regex = items[0] app.url_map.converters['regex'] = RegexConverter #此对象新增 @app.route('/') def hello_world(): return render_template('plan.html',) @app.route('/hello/<regex(".*"):name>') #关键的路由正则匹配 def hello(name): #对应的视图函数,随便你怎么写吧。 if name =='': return 'hello no name' else: return "hello '%s'" % (name)
引用BaseConverter,创建类 RegexConverter
实例化RegexConverter
在路由中使用正则规则/hello/<regex(".*"):name>
其中/hello/是固定匹配的前缀,就和匹配/hello/一样,<regex(""):>应该是规范格式,“.*”双引号里面是正则表达式,name冒号后面是命名这个变量,给下面的函数交互输入。
可匹配
并把***传入视图函数。