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

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

重定向/error

通过flask中的redirect方法和自定义的newpath函数、redirect_demo函数实现重定向:

 #coding:utf-8

 from flask import Flask, render_template,request,make_response,redirect

 app = Flask(__name__)
app.jinja_env.line_statement_prefix = '#' @app.route('/index/')
@app.route('/')
def index():
return "hello" @app.route('/profile/<int:uid>/',methods =['GET','POST'])
def profile(uid):
#传tuple类型的数据
colors = ('red','green') infos = {'nowcoder':'yy','google':'fdf'} #或者直接用return ('profile:'+str(uid))
return render_template('profile.html',uid = uid,colors = colors,infos = infos)
#前端的语言的写法uid = uid传参,将uid参数传到templates中html文件里的uid处。 @app.route('/request')
def request_demo(): key = request.args.get('key','defaultkey') #输入为http://127.0.0.1:5000/request?key=fdf时网页第一行会打印出fdf
res = request.args.get('key','defaultkey') + '<br>' res = res + request.url +'||' + request.path + '<br>' for property in dir(request):
res = res + str(property) + '|==|<br>' + str(eval('request.'+property))+'<br>'
#dir--查看属性,eval response = make_response(res)
response.set_cookie('nowcoder',key)
response.status = ''
response.headers['nowcoder'] = 'hello~'
return response
#重定向,即跳转
@app.route('/newpath')
def newpath():
return 'newpath' @app.route('/re/<int:code>')
def redirect_demo(code):
return redirect('/newpath',code = code) if __name__ == '__main__':
app.run(debug=True)

此时在网址末端修改为/newpath或/re/302(临时重定向)即可看到:

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

如果将网址末端改为/re/301(永久性跳转),发现不管跳转几次,Log中只有一个301跳转记录(理论上应该这样,但safari和google的浏览器结果不一样):

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

#错误处理(找不到该页面的统一处理)

在Py文件中定义page_not_found方法:

 #找不到页面的处理
@app.errorhandler(404)
def page_not_found(error): return render_template('not_found.html',url = request.url)

再在templates文件夹中新建一个not_found.html文件:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Not Found</title>
{{ url }}
</head>
<body> </body>
</html>

这时在网址中键入无效地址则会显示:

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

其中返回的是键入的无效地址

#页面交互,以登录界面为例

页面间的交互要在原来代码的基础上改变几件事情:

1)导入flash,get_flashed_messages模块

2) 新添加映射@app.route('/login')

3)因为login页面要和首页‘/’交互,因此修改映射@app.route('/')

4)页面交互需要设置一个随机的唯一的eudi,用serect_key来设置

 #coding:utf-8

 from flask import Flask, render_template,request,make_response,redirect,flash,get_flashed_messages

 app = Flask(__name__)
app.jinja_env.line_statement_prefix = '#'
app.secret_key = 'nowcoder' @app.route('/index/')
@app.route('/')
def index():
res = ''
#flash把消息传过去,get_flashed_messages把消息传回来
for msg in get_flashed_messages():
res = res + msg +'<br>'
res+= 'hello'
return res @app.route('/profile/<int:uid>/',methods =['GET','POST'])
def profile(uid):
#传tuple类型的数据
colors = ('red','green') infos = {'nowcoder':'yy','google':'fdf'} #或者直接用return ('profile:'+str(uid))
return render_template('profile.html',uid = uid,colors = colors,infos = infos)
#前端的语言的写法uid = uid传参,将uid参数传到templates中html文件里的uid处。 @app.route('/request')
def request_demo(): key = request.args.get('key','defaultkey') #输入为http://127.0.0.1:5000/request?key=fdf时网页第一行会打印出fdf
res = request.args.get('key','defaultkey') + '<br>' res = res + request.url +'||' + request.path + '<br>' for property in dir(request):
res = res + str(property) + '|==|<br>' + str(eval('request.'+property))+'<br>'
#dir--查看属性,eval response = make_response(res)
response.set_cookie('nowcoder',key)
response.status = '404'
response.headers['nowcoder'] = 'hello~'
return response
#重定向,即跳转
@app.route('/newpath')
def newpath():
return 'newpath' @app.route('/re/<int:code>')
def redirect_demo(code):
return redirect('/newpath',code = code) #找不到页面的处理
@app.errorhandler(404)
def page_not_found(error): return render_template('not_found.html',url = request.url) #输入的网址的末端和'/login'正则匹配的话就让网页跳转到由Login定义的新页面
@app.route('/login')
def login():
#flash把消息传过去,'/'表示返回首页
flash('登录成功!')
return redirect('/') if __name__ == '__main__':
app.run(debug=True)

键入login显示消息:

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

原理:flash中的消息传入get_flashed_messages中,然后return redirect()跳转到首页,首页方法中的return显示出最后的内容。

#logger:用来记录服务器最近发生的事

主要分为:

1)导入模块

2)登录成功后用logger记录

3)记录3种不同类型的log

4)设置log文件的存储路径

5) 在主函数中设置logger

 #coding:utf-8

 from flask import Flask, render_template,request,make_response,redirect,flash,get_flashed_messages
import logging
from logging.handlers import RotatingFileHandler app = Flask(__name__)
app.jinja_env.line_statement_prefix = '#'
app.secret_key = 'nowcoder' @app.route('/index/')
@app.route('/')
def index():
res = ''
#flash把消息传过去,get_flashed_messages把消息传回来
for msg in get_flashed_messages():
res = res + msg +'<br>'
res+= 'hello'
return res @app.route('/profile/<int:uid>/',methods =['GET','POST'])
def profile(uid):
#传tuple类型的数据
colors = ('red','green') infos = {'nowcoder':'yy','google':'fdf'} #或者直接用return ('profile:'+str(uid))
return render_template('profile.html',uid = uid,colors = colors,infos = infos)
#前端的语言的写法uid = uid传参,将uid参数传到templates中html文件里的uid处。 @app.route('/request')
def request_demo(): key = request.args.get('key','defaultkey') #输入为http://127.0.0.1:5000/request?key=fdf时网页第一行会打印出fdf
res = request.args.get('key','defaultkey') + '<br>' res = res + request.url +'||' + request.path + '<br>' for property in dir(request):
res = res + str(property) + '|==|<br>' + str(eval('request.'+property))+'<br>'
#dir--查看属性,eval response = make_response(res)
response.set_cookie('nowcoder',key)
response.status = ''
response.headers['nowcoder'] = 'hello~'
return response
#重定向,即跳转
@app.route('/newpath')
def newpath():
return 'newpath' @app.route('/re/<int:code>')
def redirect_demo(code):
return redirect('/newpath',code = code) #找不到页面的处理
@app.errorhandler(404)
def page_not_found(error): return render_template('not_found.html',url = request.url) #输入的网址的末端和'/login'正则匹配的话就让网页跳转到由Login定义的新页面
@app.route('/login')
def login():
#flash把消息传过去,'/'表示返回首页
app.logger.info('log succeed!')
flash('登录成功!')
return redirect('/') @app.route('/log/<level>/<msg>/')
def log(level,msg):
dict = {'warning':logging.WARN,'error':logging.ERROR,'info':logging.INFO}
if level in dict:
app.logger.log(dict[level],msg)
return 'logged:'+msg def set_logger():
#将info log存到D:对应路径
info_file_handler = RotatingFileHandler('/Users/icarus/Documents/info.txt')
info_file_handler.setLevel(logging.INFO)
app.logger.addHandler(info_file_handler)
warn_file_handler = RotatingFileHandler('/Users/icarus/Documents/warn.txt')
warn_file_handler.setLevel(logging.WARN)
app.logger.addHandler(warn_file_handler)
error_file_handler = RotatingFileHandler('/Users/icarus/Documents/error.txt')
error_file_handler.setLevel(logging.ERROR)
app.logger.addHandler(error_file_handler) if __name__ == '__main__':
set_logger()
app.run(debug=True)

#flask_script框架

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

搭好基本框架后在pycharm中打开终端,能发现manager.py文件拥有的功能:shell,runserver;

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

运行runserver功能:

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

在py文件中添加@mannager.command装饰器会发现py文件多了我们自定义的功能:

 #coding:utf-8
from flask_script import Manager
from test import app #定义一个script的manager
manager = Manager(app) @manager.command
def hello(name):
print ('hello',name) @manager.command
def initialized_database():
#初始化数据库
print ('database...') if __name__ =='__main__':
manager.run()

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

上一篇:Python Web实战:Python+Django+MySQL实现基于Web版的增删改查


下一篇:python web开发之flask框架学习(1) 创建flask项目