• 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()

  • 相关阅读:
    iNeuOS工业互联平台,WEB组态(iNeuView)集成rtmp和websocket视频元件,支持海康、大华等摄像头实时显示视频
    MyBatis之TypeHandler用法
    视频监控安防专网事件预警运维系统开发方案
    Qmgo 开源了! 更好用的 Go 语言 MongoDB driver
    前端使用axios传递数组后端使用List接收
    jdk1.6手册java8中英手册java9英文手册.chm(下载)
    自动化运维工具Ansible (一)
    初级模拟电路:4-11 混合π模型
    简单体验一个高性能,简单,轻量的ORM库- Dapper (无依赖其它库,非常方便高效)
    Python计算大文件行数方法及性能比较
  • 原文地址:https://www.cnblogs.com/IcarusYu/p/8366317.html
Copyright © 2020-2023  润新知