flask视图和URL学习

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


总结

这是本人(小白)的见解,如有侵权的地方,请指出,本人会立即改正
此外,有不对和不足的地方,希望大佬们指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值