重定向/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(临时重定向)即可看到:

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

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

在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>

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

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

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

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

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显示消息:

原理: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框架

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

运行runserver功能:

在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的更多相关文章

  1. Python Web 开发的十个框架【转载】

    Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...

  2. python web开发之flask框架学习(1) 创建flask项目

    python 开发越来越火,作为菜鸟,也应该学习一下,感觉还可以,记录下来,方便学习参考. 不管做什么开发首先肯定是安装环境,这里我用的是pycharm,python3.如果不清楚怎么安装环境可以去网 ...

  3. python web开发之flask框架学习(2) 加载模版

    上次学习了flask的helloword项目的创建,这次来学习flask项目的模版加载: 第一步:创建一个flask项目 第二步:在项目目录的templates文件夹下创建一个html文件 第三步: ...

  4. Python Web开发:使用Django框架创建HolleWorld项目

    开发环境搭建 Python环境安装 下载地址:https://www.python.org/downloads// Django安装 打开Windows CMD输入pip install django ...

  5. Python Web开发:Django+BootStrap实现简单的博客项目

    创建blog的项目结构 关于如何创建一个Django项目,请查看[Python Web开发:使用Django框架创建HolleWorld项目] 创建blog的数据模型 创建一个文章类 所有开发都是数据 ...

  6. Python Web开发中的WSGI协议简介

    在Python Web开发中,我们一般使用Flask.Django等web框架来开发应用程序,生产环境中将应用部署到Apache.Nginx等web服务器时,还需要uWSGI或者Gunicorn.一个 ...

  7. 真正搞明白Python中Django和Flask框架的区别

    在谈Python中Django框架和Flask框架的区别之前,我们需要先探讨如下几个问题. 一.为什么要使用框架? 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应 ...

  8. python web 开发学习路线

    转载,备着 自己目前学习python web 开发, 经过两个月的摸索,目前对web开发有了浅显的认识,把自己的学习过程贴出来.1.python入门推荐老齐<从零开始学python>,&l ...

  9. 转载:Python Web开发最难懂的WSGI协议,到底包含哪些内容?

    原文:PSC推出的第二篇文章-<Python Web开发最难懂的WSGI协议,到底包含哪些内容?>-2017.9.27 我想大部分Python开发者最先接触到的方向是WEB方向(因为总是有 ...

随机推荐

  1. Golang之hello,beego

    学习谢大神的beego记录 过程: 目录结构: 编译命令: go build -o myBeego.exe go_dev/day13/beego_example/main执行myBeego.exe即可 ...

  2. 不要用for in语句对数组进行遍历

    for...in主要用于对数组和对象的属性进行遍历.for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作. 语法:for (variable in object) ...

  3. 记录下 UTF6 GBK 转换函数

    int GBK2UTF8(char *szGbk,char *szUtf8,int Len) { // 先将多字节GBK(CP_ACP或ANSI)转换成宽字符UTF-16 // 得到转换后,所需要的内 ...

  4. linux信号量初识

    以下程序使用信号量控制程序运行 "信号"量 "变"量 /*信号量(semaphore)是变量,是一种特殊的变量.它仅取正值. 对信息号量的操作只有2种:等待(w ...

  5. 乞丐版servlet容器第2篇

    2. 监听端口接收请求 上一步中我们已经定义好了Server接口,并进行了多次重构,但是实际上那个Server是没啥毛用的东西. 现在要为其添加真正有用的功能. 大师说了,饭要一口一口吃,衣服要一件一 ...

  6. Devexpress VCL Build v2014 vol 14.2.6 发布

    终于支持XE8 了.需要这么长时间吗? New Major Features in 14.2 What's New in VCL Products 14.2 Feature Highlights To ...

  7. 解决启动nginx时报80端口被占用的问题

    如何解决启动nginx时报80端口被占用 最近公司的的一个服务器上需要部署多个项目,但80端口只有一个,所有只有使用Nginx来代理,当访问域名时就可以自动 转到IP:端口号,而不需要在域名后面加端口 ...

  8. 2018.06.30 BZOJ1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...

  9. Spring3.x错误--Pointcut is not well-formed:expecting 'name pattern' at...

    Spring3.x错误: 解决方法: (*com.dayang.service..*(..))     *和com.dayang.之间有空格

  10. 保留注释换行的python模块configparser

    python语言用来解析配置文件的模块是ConfigParser,python3中是configparser模块,我在使用中发现write方法在将配置项重新写入文 件时,配置文件中的空行和注释行都会被 ...