Python初级项目Week2: Flask

装饰器(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

猜你喜欢

转载自blog.csdn.net/qq_35414878/article/details/80064859