python web开发——c2 flask框架和flask_script

 

重定向/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     app.logger.info('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()

posted @ 2018-01-27 15:59  IcarusYu  阅读(254)  评论(0编辑  收藏  举报