
重定向/error
通过flask中的redirect方法和自定义的newpath函数、redirect_demo函数实现重定向:
1 #coding:utf-8
2
3 from flask import Flask, render_template,request,make_response,redirect
4
5 app = Flask(__name__)
6 app.jinja_env.line_statement_prefix = '#'
7
8 @app.route('/index/')
9 @app.route('/')
10 def index():
11 return "hello"
12
13 @app.route('/profile/<int:uid>/',methods =['GET','POST'])
14 def profile(uid):
15 #传tuple类型的数据
16 colors = ('red','green')
17
18 infos = {'nowcoder':'yy','google':'fdf'}
19
20 #或者直接用return ('profile:'+str(uid))
21 return render_template('profile.html',uid = uid,colors = colors,infos = infos)
22 #前端的语言的写法uid = uid传参,将uid参数传到templates中html文件里的uid处。
23
24
25 @app.route('/request')
26 def request_demo():
27
28 key = request.args.get('key','defaultkey')
29
30 #输入为http://127.0.0.1:5000/request?key=fdf时网页第一行会打印出fdf
31 res = request.args.get('key','defaultkey') + '<br>'
32
33 res = res + request.url +'||' + request.path + '<br>'
34
35 for property in dir(request):
36 res = res + str(property) + '|==|<br>' + str(eval('request.'+property))+'<br>'
37 #dir--查看属性,eval
38
39 response = make_response(res)
40 response.set_cookie('nowcoder',key)
41 response.status = '404'
42 response.headers['nowcoder'] = 'hello~'
43 return response
44 #重定向,即跳转
45 @app.route('/newpath')
46 def newpath():
47 return 'newpath'
48
49
50 @app.route('/re/<int:code>')
51 def redirect_demo(code):
52 return redirect('/newpath',code = code)
53
54
55
56 if __name__ == '__main__':
57 app.run(debug=True)
此时在网址末端修改为/newpath或/re/302(临时重定向)即可看到:
如果将网址末端改为/re/301(永久性跳转),发现不管跳转几次,Log中只有一个301跳转记录(理论上应该这样,但safari和google的浏览器结果不一样):
#错误处理(找不到该页面的统一处理)
在Py文件中定义page_not_found方法:
1 #找不到页面的处理
2 @app.errorhandler(404)
3 def page_not_found(error):
4
5 return render_template('not_found.html',url = request.url)
再在templates文件夹中新建一个not_found.html文件:
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>Not Found</title>
6 {{ url }}
7 </head>
8 <body>
9
10 </body>
11 </html>
这时在网址中键入无效地址则会显示:
其中返回的是键入的无效地址
#页面交互,以登录界面为例
页面间的交互要在原来代码的基础上改变几件事情:
1)导入flash,get_flashed_messages模块
2) 新添加映射@app.route('/login')
3)因为login页面要和首页‘/’交互,因此修改映射@app.route('/')
4)页面交互需要设置一个随机的唯一的eudi,用serect_key来设置
1 #coding:utf-8
2
3 from flask import Flask, render_template,request,make_response,redirect,flash,get_flashed_messages
4
5 app = Flask(__name__)
6 app.jinja_env.line_statement_prefix = '#'
7 app.secret_key = 'nowcoder'
8
9
10
11 @app.route('/index/')
12 @app.route('/')
13 def index():
14 res = ''
15 #flash把消息传过去,get_flashed_messages把消息传回来
16 for msg in get_flashed_messages():
17 res = res + msg +'<br>'
18 res+= 'hello'
19 return res
20
21
22 @app.route('/profile/<int:uid>/',methods =['GET','POST'])
23 def profile(uid):
24 #传tuple类型的数据
25 colors = ('red','green')
26
27 infos = {'nowcoder':'yy','google':'fdf'}
28
29 #或者直接用return ('profile:'+str(uid))
30 return render_template('profile.html',uid = uid,colors = colors,infos = infos)
31 #前端的语言的写法uid = uid传参,将uid参数传到templates中html文件里的uid处。
32
33
34
35 @app.route('/request')
36 def request_demo():
37
38 key = request.args.get('key','defaultkey')
39
40 #输入为http://127.0.0.1:5000/request?key=fdf时网页第一行会打印出fdf
41 res = request.args.get('key','defaultkey') + '<br>'
42
43 res = res + request.url +'||' + request.path + '<br>'
44
45 for property in dir(request):
46 res = res + str(property) + '|==|<br>' + str(eval('request.'+property))+'<br>'
47 #dir--查看属性,eval
48
49 response = make_response(res)
50 response.set_cookie('nowcoder',key)
51 response.status = '404'
52 response.headers['nowcoder'] = 'hello~'
53 return response
54 #重定向,即跳转
55 @app.route('/newpath')
56 def newpath():
57 return 'newpath'
58
59
60 @app.route('/re/<int:code>')
61 def redirect_demo(code):
62 return redirect('/newpath',code = code)
63
64 #找不到页面的处理
65 @app.errorhandler(404)
66 def page_not_found(error):
67
68 return render_template('not_found.html',url = request.url)
69
70
71 #输入的网址的末端和'/login'正则匹配的话就让网页跳转到由Login定义的新页面
72 @app.route('/login')
73 def login():
74 #flash把消息传过去,'/'表示返回首页
75 flash('登录成功!')
76 return redirect('/')
77
78
79
80 if __name__ == '__main__':
81 app.run(debug=True)
键入login显示消息:
原理:flash中的消息传入get_flashed_messages中,然后return redirect()跳转到首页,首页方法中的return显示出最后的内容。
#logger:用来记录服务器最近发生的事
主要分为:
1)导入模块
2)登录成功后用logger记录
3)记录3种不同类型的log
4)设置log文件的存储路径
5) 在主函数中设置logger
1 #coding:utf-8
2
3 from flask import Flask, render_template,request,make_response,redirect,flash,get_flashed_messages
4 import logging
5 from logging.handlers import RotatingFileHandler
6
7
8 app = Flask(__name__)
9 app.jinja_env.line_statement_prefix = '#'
10 app.secret_key = 'nowcoder'
11
12
13
14 @app.route('/index/')
15 @app.route('/')
16 def index():
17 res = ''
18 #flash把消息传过去,get_flashed_messages把消息传回来
19 for msg in get_flashed_messages():
20 res = res + msg +'<br>'
21 res+= 'hello'
22 return res
23
24
25 @app.route('/profile/<int:uid>/',methods =['GET','POST'])
26 def profile(uid):
27 #传tuple类型的数据
28 colors = ('red','green')
29
30 infos = {'nowcoder':'yy','google':'fdf'}
31
32 #或者直接用return ('profile:'+str(uid))
33 return render_template('profile.html',uid = uid,colors = colors,infos = infos)
34 #前端的语言的写法uid = uid传参,将uid参数传到templates中html文件里的uid处。
35
36
37
38 @app.route('/request')
39 def request_demo():
40
41 key = request.args.get('key','defaultkey')
42
43 #输入为http://127.0.0.1:5000/request?key=fdf时网页第一行会打印出fdf
44 res = request.args.get('key','defaultkey') + '<br>'
45
46 res = res + request.url +'||' + request.path + '<br>'
47
48 for property in dir(request):
49 res = res + str(property) + '|==|<br>' + str(eval('request.'+property))+'<br>'
50 #dir--查看属性,eval
51
52 response = make_response(res)
53 response.set_cookie('nowcoder',key)
54 response.status = '404'
55 response.headers['nowcoder'] = 'hello~'
56 return response
57 #重定向,即跳转
58 @app.route('/newpath')
59 def newpath():
60 return 'newpath'
61
62
63 @app.route('/re/<int:code>')
64 def redirect_demo(code):
65 return redirect('/newpath',code = code)
66
67 #找不到页面的处理
68 @app.errorhandler(404)
69 def page_not_found(error):
70
71 return render_template('not_found.html',url = request.url)
72
73
74 #输入的网址的末端和'/login'正则匹配的话就让网页跳转到由Login定义的新页面
75 @app.route('/login')
76 def login():
77 #flash把消息传过去,'/'表示返回首页
78 ('log succeed!')
79 flash('登录成功!')
80 return redirect('/')
81
82
83 @app.route('/log/<level>/<msg>/')
84 def log(level,msg):
85 dict = {'warning':logging.WARN,'error':logging.ERROR,'info':logging.INFO}
86 if level in dict:
87 app.logger.log(dict[level],msg)
88 return 'logged:'+msg
89
90 def set_logger():
91 #将info log存到D:对应路径
92 info_file_handler = RotatingFileHandler('/Users/icarus/Documents/info.txt')
93 info_file_handler.setLevel(logging.INFO)
94 app.logger.addHandler(info_file_handler)
95 warn_file_handler = RotatingFileHandler('/Users/icarus/Documents/warn.txt')
96 warn_file_handler.setLevel(logging.WARN)
97 app.logger.addHandler(warn_file_handler)
98 error_file_handler = RotatingFileHandler('/Users/icarus/Documents/error.txt')
99 error_file_handler.setLevel(logging.ERROR)
100 app.logger.addHandler(error_file_handler)
101
102
103
104
105 if __name__ == '__main__':
106 set_logger()
107 app.run(debug=True)
#flask_script框架
搭好基本框架后在pycharm中打开终端,能发现manager.py文件拥有的功能:shell,runserver;
运行runserver功能:
在py文件中添加@mannager.command装饰器会发现py文件多了我们自定义的功能:
1 #coding:utf-8
2 from flask_script import Manager
3 from test import app
4
5 #定义一个script的manager
6 manager = Manager(app)
7
8
9 @manager.command
10 def hello(name):
11 print ('hello',name)
12
13 @manager.command
14 def initialized_database():
15 #初始化数据库
16 print ('database...')
17
18
19 if __name__ =='__main__':
20 manager.run()
















