- 此为牛客网python初级项目,侵权立删
装饰器(decorator)
- 教程:http://python.jobbole.com/85056/
args
:用来传递任意个无名字参数,这些参数以一个Tuple的形式访问kvargs
:用来处理传递任意个有名字的参数,这些参数用dict来访问- 示例代码:
def log(level, *args, **kvargs):
def inner(func):
def wrapper(*args, **kvargs):
print(level, 'before calling', func.__name__)
print('args', args, 'kvargs', kvargs)
func(*args, **kvargs)
print(level, "end calling", func.__name__)
return wrapper
return inner
@log(level='INFO')
def hello(name, age):
print('hello', name, age)
if __name__ == '__main__':
hello('aaa', 22) 这里参数处理为args
hello(name='aaa', age=10) 这里参数处理为kvargs
flask
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
运行代码,并且在浏览器输入http://127.0.0.1:5000/
,即可见到Hello World!
flask API
Flask
class flask.Flask(import_name, static_path=None, static_url_path=None, static_folder='static', template_folder='templates', instance_path=None, instance_relative_config=False)
- 所以app为一个
import_name=__name__
的Flask对象,app为一个WSGI应用
重定向(redirect)
- 301:永久转移
- 302:临时转移
- 示例代码:将
/re/301(302)
重定位到/newpath
from flask import redirect
@app.route('/newpath/')
def newpath():
return 'newpath'
@app.route('/re/<int:code>')
def redirect_demo(code):
return redirect('/newpath/', code=code)
- 在浏览器输入
localhost:5000/re/302
会自动跳转至localhost:5000/newpath
- 301和302的区别体现:
最后结果登陆时:301无论跳几次,都只有一次定位(即之后直接是/newpath),而302跳几次,就会有几个重定向
request 和 response
from flask import request, make_response
@app.route('/request/')
def request_demo():
key = request.args.get('key', 'default key') + '<br>'
res = request.args.get('key', 'default key') + '<br>'
res = res + request.url + request.path + '<br>'
for property in dir(request):
res = res + str(eval('request.' + property)) + '<br>'
response = make_response(res)
response.set_cookie('nowcoder', key)
# print dir(response)
response.status = '404'
response.headers['nowcoder'] = 'hello~~'
return response
- request:
- response:
flash
- 发送:获取接口信息,flash(msg)
- 获取:
get_flashed_messages
- 属性:通过session传递消息
from flask import flash, get_flashed_messages
@app.route('/')
def index():
res = ''
for msg in get_flashed_messages(): #这边获取信息
res = res + msg + '<br>'
res += 'hello'
return res #在页面上显示res
@app.route('/login/')
def login():
app.logger.info('log success')
flash('login successfully') #发送信息
return redirect('/') #重定向到`127.0.0.5000/`
Error
@app.errorhandler(404)
def page_not_found(error):
print(error)
return render_template('not_found.html', url=request.url), 404
- not_found.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Not Found</title>
{{ url }} #只是把url显示出来
</head>
<body>
</body>
</html>
log
- 重要性:ERROR > WARN > INFO
- 体现:写到ERROR的log文件里的消息会写到所有3个文件里,但是INFO文件的消息不会到WARN和ERROR的log文件中
import logging
from logging.handlers import RotatingFileHandler
@app.route('/log/<level>/<msg>/')
def log(level, msg): #从url获取参数
dict = {'warn': logging.WARN, 'error': logging.ERROR, 'info': logging.INFO}
if dict.get(level):
app.logger.log(dict[level], msg) #把msg内容写到dict[level]对应的文件
return 'logged:' + msg #在网页上返回的内容
def set_logger():
info_file_handler = RotatingFileHandler('C:\\logs\\info.txt')
info_file_handler.setLevel(logging.INFO)
app.logger.addHandler(info_file_handler)
warn_file_handler = RotatingFileHandler('C:\\logs\\warn.txt')
warn_file_handler.setLevel(logging.WARN)
app.logger.addHandler(warn_file_handler)
error_file_handler = RotatingFileHandler('C:\\logs\\error.txt')
error_file_handler.setLevel(logging.ERROR)
app.logger.addHandler(error_file_handler)
if __name__ == '__main__':
set_logger()
app.run(debug=True)
- 然后在浏览器输入
127.0.0.1:5000/log/error/errorimformation
- 就会发现
info.txt
,warn.txt
,error.txt
都有了errorimformation