flask视图和URL
文章目录
前言
Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框
架。
Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数
据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文
件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。
其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。
一、参数的传参方式
1 应用程序参数
1 创建一个类
2 代码如下
3这里的默认配置必须大写
from flask import Flask
#web常量配置
class Dc(object):
#默认配置
USER = 'root'
PWD = '123123'
app=Flask(__name__)
app.config.from_object(Dc) #取参
@app.route('/')
def index():
print(app.config['PWD'])
print(app.config['USER'])
return 'hello world!'
if __name__ == '__main__':
app.run()
2.在文件中传参
1在py文件好默认参数
2 也必须是大写
3在整个项目里面所有函数都可以调用
4 在配置文件的代码
#web项目的整个配置
USER='YWX'
PWD='12345'
注意:这里的app.config.from_pyfile(‘settings.py’) 中的settings.py 是上面我们配置好的py文件
from flask import Flask
app=Flask(__name__)
app.config.from_pyfile('settings.py') #取参
@app.route('/')
def index():
print(app.config['PWD'])
print(app.config['USER'])
return 'hello world!'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8080)
3.在环境变量传参
1要先在终端实行 export SETTING_PATH=’~/settings.py’
这里的’~/settings.py’ 是配置文件的路径
2代码示例如下
3app.config.from_envvar(‘SETTING_PATH’,silent=True) 这行代码的‘SETTING_PATH’ 必须要和在终端定义 export SETTING_PATH=’~/setting.py’ 里的(SETTING_PATH)一摸一样
from flask import Flask
app=Flask(__name__)
app.config.from_envvar('SETTING_PATH',silent=True) #取参
# silent参数 在企业中一般设置为TRUE
# False 表示不安静的处理,没有值时报错通知,默认为False
# True 表示安静的处理,即使没有值也让Flask正常的运行下去
@app.route('/')
def index():
print(app.config['PWD'])
print(app.config['USER'])
return 'hello world!'
if __name__ == '__main__':
app.run()
二、动态路由和自定义转换器
动态路由
- 是路由加上转换器来实现的动态路由
- 动态路由是方便在客户端(浏览器)里的url直接输入参数
- 例如 127.0.0.0:5000/user/12
@app.route('/user/<int(min=1):id>') #整型最小值为1的动态路由
def users(id): #转换器:负责提取动态URL中的id数据,并且把id数据传给视图函数
print(type(id))
return '当前访问的用户是:用户{}'.format(id)
- flask 框架提供的转换器还有很多,大家可以自己的需求来定义
自定义转化器
- 转换器的作用是负责提取动态url中的自定义数据,并且把自定义的数据传给视图函数
- 那么自定转换器就是按照自己的需求来定义,能和url配合形成动态路由,因此更便捷我们工作
- 下面代码实现的是定义一个转化器来实现 ,我们输入号码格式是否合格
注意:1,自定义的转换器必须导入from werkzeug.routing import BaseConverter
2,将定义的转换器添加到转换器列表中 app.url_map.converters[‘phones’]=Mc 的[‘phones’] 必须要和
@app.route(’/phone/phones:mob_num’) 里的phones一致
from flask import Flask
from werkzeug.routing import BaseConverter
#我们自己定义的转换器必须要继承
class Mc(BaseConverter):
#定义一个匹配手机号的正则表达式 注意regex名字不能改变
regex = r'1[3-9]\d{9}'
app = Flask(__name__)
# 将自定义的转换器添加到转换器列表中
app.url_map.converters['phones']=Mc
@app.route('/phone/<phones:mob_num>')
def phone_number(mob_num):
return '号码:{}'.format(mob_num)
if __name__ == '__main__':
app.run()
三, 地址重定向和url_for
地址重定向
- 地址重定向的作用是客户端(浏览器)向服务器发送两次请求
- 导入 from flask import Flask,redirect
@app.route('/demo1')
def demo1():
#浏览器实现两次访问
return redirect('http://baidu.com')
url_for
1.通过函数可以生成url
2.url_for需要传两个及以上参数,第一个参数是视图函数,第二个后面开始是转换器的值
3.url_for可以在当前函数使用,例如:url_for(‘phone_number’,mob_num=‘19800001111’)
中的’phone_number’ 是一个视图函数,mob_num=‘19800001111’ 是这个视图函数的转换器。
4.通过调用url_for函数生成路由url,再配合地址重定向redirect,就可以实现通过刚才生成的路由url再次向服务器发送请求,就可以实现phone_number函数的功能。
下面这张图片是实现phone_number函数的功能。
通过url,我们可以发现并未传入参数,而是通过刚生成url配合地址重定向再次向服务器发送请求实现的。
from flask import Flask,url_for,redirect
from werkzeug.routing import BaseConverter
#我们自己定义的转换器必须要继承
class Mc(BaseConverter):
#定义一个匹配手机号的正则表达式 注意regex名字不能改变
regex = r'1[3-9]\d{9}'
app = Flask(__name__,static_url_path='/ywx')
app.config['JSON_AS_ASCII']=False #设置json编码格式 如果为False 就不使用ascii编码
# 将自定义的转换器添加到转换器列表中
app.url_map.converters['phones']=Mc #phone是转换器的名字
@app.route('/')
def hello_world(): # put application's code here
#url_for的主要目的:是为了按照路由列表生成一个动态url地址
print(url_for('phone_number',mob_num='19800001111'))
print(url_for('phone_number',mob_num='19800001111',page=2))
print(url_for('phone_number',mob_num='19800001111',page='中国'))
return redirect(url_for('phone_number',mob_num='19800001112')) #redirect重定向客户端(浏览器)发生两次请求
@app.route('/phone/<phones:mob_num>')
def phone_number(mob_num):
return '号码:{}'.format(mob_num)
if __name__ == '__main__':
app.run()
生成的url如下
四,请求和响应
1,请求
1.request中的GET请求方式
功能:读取客户端(浏览器)向服务器发送的请求的数据
其中,methods=[‘GET’] 是请求方式
from flask import Flask,request
app = Flask(__name__)
@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'
@app.route('/test1',methods=['GET'])
def test1():
id=request.args.get('id')
name=request.args.get('name')
print('用户id:{},用户姓名;{}'.format(id,name))
return '请求成功!;name:%s,id:%s'%(name,id)
if __name__ == '__main__':
app.run()
在postman模拟请求
2.request中的POST请求方式
功能:功能:读取客户端(浏览器)向服务器发送的请求的数据
其中,methods=[‘POST’] 是请求方式
from flask import Flask,request,render_template
app = Flask(__name__)
@app.route('/test2',methods=['POST'])
def test2():
name=request.form.get('name')
age=request.form.get('age')
print('name的值{},类型是:{}'.format(name,type(name)))
print('age的值{},类型是:{}'.format(age,type(age)))
if __name__ == '__main__':
#8080端口允许当前系统所以ip访问 debug=True 这个设置把错误信息反应到页面来 默认False
app.run(host='0.0.0.0',port=8080,debug=False)
3.文件上传
- 文件上传的路径是static静态目录,所以要先模仿客户端界面(自己动手写一个HTML文件)
- 这里我们模仿一个上传个人信息的界面
注意:
<form action="/test2" method="post" enctype="multipart/form-data">中的enctype="multipart/form-data"
是不能少的
原因可以参考如下博客所写:
表单中enctype=”multipart/form-data”的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.
enctype=”multipart/form-data”是上传二进制数据; form里面的input的值以2进制的方式传过去。 form里面的input的值以2进制的方式传过去,所以request就得不到值了
————————————————
版权声明:本文为CSDN博主「寸寸时光」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wang17866603359/article/details/77259441
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试请求方式和请求参数</title>
<style>
.parent{
text-align: center;
}
</style>
</head>
<body>
<body>
<div class="parent">
<h2>请求方式</h2>
<h5>post请求</h5>
<form action="/test2" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="user_name"> <br>
年龄:<input type="text" name="age"> <br>
上传:<input type="file" name="image"> <br>
<input type="submit">
</form>
</div>
</body>
</body>
</html>
在py文件的代码如下
其中f.save(’./static/demo.jpg/) 是文件存储路径
from flask import Flask,request,render_template
app = Flask(__name__)
@app.route('/test2',methods=['POST'])
def test2():
name=request.form.get('name')
age=request.form.get('age')
# #文件上传 注意:enctype="multipart/form-data"
# f=request.files['image']
# f.save('./static/demo.jpg')
return 'post请求成功'
if __name__ == '__main__':
app.run()
2,响应
1,响应状态
- 响应状态是客户端(浏览器)向服务器发送请求后在客户端界面显示的状态
- 我们可以通过响应状态,来判断向服务器请求的结果
- 这个响应状态可以自己定义也可以默认
1.自定义响应状态需要导入make_response
2.resp=make_response(‘make response 响应内容’) 这个括号里面是展现在客户端界面的内容可以自己随便定义
3. resp.status=‘404 not found’ #响应状态 也是自己定义的 一般是500 200 404
4.resp.headers[‘my_parm’]=‘Python-3.8’ 这个是响应头
5. 客户端界面如下: 可以看到我们自己定义的内容
代码示例
这里的name=‘张三’,age=21 的就是我们要替换的数据
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/demo5')
def demo5():
return render_template('index.html',name='张三',age=21)
if __name__ == '__main__':
app.run()
总结
这是本人(小白)的见解,如有侵权的地方,请指出,本人会立即改正
此外,有不对和不足的地方,希望大佬们指出!