【Flask框架】——09 视图和URL总结

在这里插入图片描述

在这里插入图片描述



一、创建flask项目

1、安装环境

创建虚拟环境

mkvirtualenv flask_env

安装Flask

pip install flask

查看虚拟环境

workon

进入虚拟环境

workon flask_env

列出当前虚拟环境安装的库

pip list

在这里插入图片描述

2、创建项目

在这里插入图片描述


在这里插入图片描述


项目下:app.py文件

rom flask import Flask

app = Flask(__name__)  # 初始化 Flask项目的服务


@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'


if __name__ == '__main__':
  
    app.run()

3、启动程序

方式一:pycharm run

在这里插入图片描述

方式二 :terminal python app.py

在这里插入图片描述

方式三 进入目录 python app.py

在这里插入图片描述

方式四 设置环境变量 set FLASK_APP = app.py

flask run

在这里插入图片描述

Ctrl + C 关闭程序

4、访问项目

浏览器输入:127.0.0.1:5000/

在这里插入图片描述


二、flask参数说明

1.初始化flask项目

app.py文件下,初始化 Flask项目的服务

在类Flask中传入__name__参数

from flask import Flask

app = Flask(__name__, static_url_path='/flyme', static_folder='static')


@app.route('/helloworld')
def hello_world():  # put application's code here
    return 'Hello World!'


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5555, debug=True)

2.参数说明

接下来就来详细查看一下 Flask 应用程序在创建的时候一些需要我们关注的参数

def __init__(
        self,
        import_name: str,
        static_url_path: t.Optional[str] = None,
        static_folder: t.Optional[t.Union[str, os.PathLike]] = "static",
        static_host: t.Optional[str] = None,
        host_matching: bool = False,
        subdomain_matching: bool = False,
        template_folder: t.Optional[str] = "templates",
        instance_path: t.Optional[str] = None,
        instance_relative_config: bool = False,
        root_path: t.Optional[str] = None,
    ):

import_name:str,
当前Flask程序所在的包(模块)名字,传 __name__ 就可以 其可以决定 Flask 在访问静态文件时查找的路径

static_url_path: t.Optional[str] = None,
静态文件访问路径,可以不传,默认为:/ + static_folder

static_folder: t.Optional[t.Union[str,os.PathLike]] = "static",
静态文件存储的文件夹,可以不传,默认为 static

template_folder: t.Optional[str] = "templates",
模板文件存储的文件夹,可以不传,默认为 templates

修改参数

from flask import Flask

app = Flask(__name__, static_url_path='/Flyme awei', static_folder='static')  # 初始化 Flask项目的服务


@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'


if __name__ == '__main__':
    # IP:0.0.0.0 代表当前计算机所有的IP地址,
    # port:端口默认是 5000
    # flask的debug模式:把错误信息显示到页面中
    app.run(host='0.0.0.0', port=5000, debug=True)

debug源文件

在这里插入图片描述

app = Flask(__name__,static_folder='static')
----
|---folder_param # 此处目录名变化 | 
|--- 1.png 
|---helloworld.py 

访问127.0.0.1:5000/static_url_path/1.png才可以访问到图片

在这里插入图片描述

app.run参数

可以指定运行的主机IP地址,端口,是否开启调试模式

app.run(host="0.0.0.0", debug = True) 

IP:0.0.0.0 代表当前计算机所有的IP地址

3.DEBUG调试模式

在这里插入图片描述

1.程序代码修改后可以自动重启服务器

2.在服务器出现相关错误的时候可以直接将错误信息返回到前端进行展示

在这里插入图片描述


三、应用程序的参数加载

应用程序配置参数设置的是一个Web应用工程的相关信息,比如:

  • 数据库的连接信息

  • 日志的配置信息

  • 自定义的配置信息

注意:这样可以集中管理项目的所有配置信息

Flask将配置信息保存到了app.config属性中,该属性可以按照字典类型进行操作。

1.从配置对象中加载

app.config.from_object()

# -*- coding: utf-8 -*-
# @File  : 02应用程序参数.py
# @author: Flyme awei 
# @email : 1071505897@qq.com
# @Time  : 2022/7/26 0:25


from flask import Flask


class DefaultConfig(object):
    """默认Web项目配置"""
    USER = 'Flyme awei'
    PWD = 'root'


app = Flask(__name__)

# 从配置对象中加载
app.config.from_object(DefaultConfig)


@app.route('/')
def index():
    print(app.config['USER'])
    print(app.config["PWD"])
    return "hello word!"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

在这里插入图片描述


这样的好处是可以在项目开发中来继承和重写:

class MyDevelopmentConfig(DefaultConfig): 
	DEBUG=True

2.从配置文件中加载

新建一个配置文件setting.py ,这个文件中的内容是:参数名=参数值 ,比
如:PWD = 'root'

app.config.from_pyfile('setting.py')

# -*- coding: utf-8 -*-
# @File  : setting.py.py
# @author: Flyme awei 
# @email : 1071505897@qq.com
# @Time  : 2022/7/26 0:38


# Web 项目的整个配置文件
USER = 'Flyme awei'
PWD = 'root'

# -*- coding: utf-8 -*-
# @File  : 02从配置对象中加载.py
# @author: Flyme awei 
# @email : 1071505897@qq.com
# @Time  : 2022/7/26 0:25


from flask import Flask


app = Flask(__name__)

# 从配置文件中加载
app.config.from_pyfile('setting.py')


@app.route('/')
def index():
    print(app.config['USER'])
    print(app.config["PWD"])
    return "hello word!"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

在这里插入图片描述

3.从环境变量中加载

先配置环境变量

在这里插入图片描述

在这里插入图片描述

Flask使用环境变量加载配置的本质是通过环境变量值找到配置文件,再读取配置文件的信息,其使用方式为

app.config.from_envvar('环境变量名')

环境变量的值为配置文件的绝对路径

先在终端中执行如下命令

export PROJECT_SETTING='~/setting.py

# -*- coding: utf-8 -*-
# @File  : 04从环境变量中加载.py
# @author: Flyme awei 
# @email : 1071505897@qq.com
# @Time  : 2022/7/26 0:50


from flask import Flask


app = Flask(__name__)

# 从环境变量中加载
app.config.from_envvar('SETTING_PATH', silent=True)


@app.route('/')
def hello_word():
    print(app.config['USER'])
    print(app.config['PWD'])
    return 'hello word'


if __name__ == '__main__':
    app.run('0.0.0.0', 8888, debug=True)
    

silent参数:

False 表示不安静的处理,没有值时报错通知,默认为False

True 表示安静的处理,即时没有值也让Flask正常的运行下去

4.从Pycharm中的运行时设置环境变量的方式加载

使用非常少

在这里插入图片描述

在这里插入图片描述

5.企业项目开发常用的方式

使用工厂模式创建Flask app,并结合使用配置对象与环境变量加载配置

  • 使用配置对象加载默认配置

  • 使用环境变量加载不想出现在代码中的敏感配置信息

def create_flask_app(config): 
	""" 创建Flask应用 :param config: 配置对象 :return: Flask应用 """ 
	app = Flask(__name__) 
	app.config.from_object(config)

	# 从环境变量指向的配置文件中读取的配置信息会覆盖掉从配置对象中加载的同名参数
	app.config.from_envvar("PROJECT_SETTING", silent=True) 
	return app 


class DefaultConfig(object): 
	"""默认配置""" 
	USER = 'ROOT' 


class DevelopmentConfig(DefaultConfig): 
	DEBUG=True 


# app = create_flask_app(DefaultConfig)
app = create_flask_app(DevelopmentConfig) 


@app.route("/") 
def index(): 
	print(app.config['USER']) 
	return "hello world"

四、路由和列表信息

rules = app.url_map.iter_rules()

[rule.rule for rule in rules]  # 路由
[rule.endpoint for rule in rules]  # 视图

rules就是整个Web项目的路由表

# -*- coding: utf-8 -*-
# @File  : 05路由列表.py
# @author: 北极的三哈
# @email : Flymeawei@163.com
# @Time  : 2022/12/3 18:47
""""""
import json
from flask import Flask


app = Flask(__name__, static_url_path='/Flyme', static_folder='static')


@app.route('/rules')
def rules_func():
    # rules就是整个Web项目的路由表
    rules = app.url_map.iter_rules()

    for rule in rules:
        print(f'视图函数:{rule.endpoint},路由:{rule.rule}')

    return json.dumps({rule.endpoint: rule.rule for rule in rules})


@app.route('/test')
def test():
    return ''


@app.route('/test2')
def test2():
    return ''


if __name__ == 'main':
    app.run(host='0.0.0.0', port=8080, debug=True)

在这里插入图片描述


五、动态路由和自定义转换器

1.动态路由

# -*- coding: utf-8 -*-
# @File  : 06动态路由.py
# @author: 北极的三哈
# @email : Flymeawei@163.com
# @Time  : 2022/12/3 19:29
""""""
from flask import Flask

app = Flask(__name__, static_folder='static')


@app.route('/')
def hello_world():
    return 'Hello World'


@app.route('/user/<user_id>')
def users(user_id):  # 转换器:负责提取动态URL中的id,并且把id数据传给视图函数
    print(type(user_id))
    return '当前访问的用户是:用户{}'.format(user_id)


if __name__ == 'main':
    # 0.0.0.0代表当前系统中所有ip,端口号默认是5000,flask的debug模式:把错误信息显示到页面中
    app.run(host='0.0.0.0', debug=True)

在这里插入图片描述


2.自定义转换器

# -*- coding: utf-8 -*-
# @File  : 06动态路由.py
# @author: 北极的三哈
# @email : Flymeawei@163.com
# @Time  : 2022/12/3 19:29
""""""
from flask import Flask
from werkzeug.routing import BaseConverter


# 自定义转换器
# 我们自定义的转换器必须要继承当前的BaseConverter父类
class MobileConverter(BaseConverter):
    """定义一个匹配手机号的正则表达式"""
    regex = r'1[3-9]\d{9}'


app = Flask(__name__, static_folder='static')

# 将自定义转换器添加到转换器列表中
app.url_map.converters['phone'] = MobileConverter


@app.route('/')
def hello_world():
    return 'Hello World'


@app.route('/phone/<mob_num>')
def phone_number(mob_num):
    return '当前你访问的手机号码是:{}'.format(mob_num)


if __name__ == 'main':
    # 0.0.0.0代表当前系统中所有ip,端口号默认是5000,flask的debug模式:把错误信息显示到页面中
    app.run(host='0.0.0.0', debug=True)

在这里插入图片描述


六、地址重定向和url_for

地址重定向redirecturl_for

# -*- coding: utf-8 -*-
# @File  : 08地址重定向.py
# @author: 北极的三哈
# @email : Flymeawei@163.com
# @Time  : 2022/12/3 19:29
""""""
from flask import Flask, redirect, url_for
from werkzeug.routing import BaseConverter


# 自定义转换器
# 我们自定义的转换器必须要继承当前的BaseConverter父类
class MobileConverter(BaseConverter):
    """定义一个匹配手机号的正则表达式"""
    regex = r'1[3-9]\d{9}'


app = Flask(__name__, static_folder='static')

# 将自定义转换器添加到转换器列表中
app.url_map.converters['phone'] = MobileConverter


@app.route('/')
def hello_world():
    return 'Hello World'


@app.route('/redirect_phone')
def redirectPhone():
    url = url_for('phone_number', mob_num='18888888888')
    return redirect(url)


@app.route('/SanHa')
def SanHa():
    # 访问http://127.0.0.1:5000/SanHa 重定向到 https://aweia.blog.csdn.net/
    return redirect('https://aweia.blog.csdn.net/')


@app.route('/phone/<mob_num>')
def phone_number(mob_num):
    return '当前你访问的手机号码是:{}'.format(mob_num)


if __name__ == 'main':
    # 0.0.0.0代表当前系统中所有ip,端口号默认是5000,flask的debug模式:把错误信息显示到页面中
    app.run(host='0.0.0.0', debug=True)

在这里插入图片描述


七、request请求和get、post请求

1.request参数

指定请求方式

在Flask中,可以定义路由默认的请求方式:

利用 methods 参数可以自己指定一个接口的请求方式

get方式:把请求参数放到为url的?后面,每个请求参数格式为:参数名=参数值。参数之间采用&符号隔开。采用的字符数据传输,所以也叫明文的请求

# get请求
@app.route('/test', methods=['GET'])
def test():
    user_id = request.args.get('user_id')
    print('用户id是:{}'.format(user_id))
    user_name = request.args.get('user_name')
    print('用户的名字是:{}'.format(user_name))
    return '请求成功'

HTML文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试请求方式和请求参数</title>
    <style>
        .parent{
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="parent">
        <h2>请求方式</h2>
        <a href="/test?user_id=1001&user_name=SanHa">get请求</a>
        <h5>post请求</h5>
        <form action="/test2" method="post" enctype="multipart/form-data">
            姓名:<input type="text" name="user_name"><br>
            年龄:<input type="text" name="user_age"><br>
            上传:<input type="file" name="image"><br>
            <input type="submit">
        </form>
    </div>
</body>
</html>

post: 表单提交,并且采用字节流的方式传递数据

# post请求
@app.route('/test2', methods=['POST'])
def test2():
    name = request.form.get('user_name')
    age = request.form.get('user_age')
    print('name的值是:{}类型是:{}'.format(name, type(name)))
    print('age的值是:{}类型是:{}'.format(age, type(age)))
    return 'post请求成功'

2.其他参数

如果想要获取其他地方传递的参数,可以通过Flask提供的request对象来读取。

不同位置的参数都存放在request的不同属性中

属性 说明 类型
data 记录请求的数据,并转换为字符串 *
form 记录请求中的表单数据 MultiDict
args 记录请求中的查询参数 MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的报文头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件 *

例如 想要获取请求 /test?user_id=1001user_id 的参数,可以按如下方式使用:

在这里插入图片描述

上传文件
客户端上传文件到服务器,并保存到服务器中

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试请求方式和请求参数</title>
    <style>
        .parent{
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="parent">
        <h2>请求方式</h2>
        <a href="/test?user_id=1001&user_name=SanHa">get请求</a>
        <h5>post请求</h5>
        <form action="/test2" method="post" enctype="multipart/form-data">
            姓名:<input type="text" name="user_name"><br>
            年龄:<input type="text" name="user_age"><br>
            上传:<input type="file" name="image"><br>
            <input type="submit">
        </form>
    </div>
</body>
</html>

在这里插入图片描述

# post请求
@app.route('/test2', type(age)))

    # 文件上传 注意:需要在表单页面中加上属性 enctype="multipart/form-data"
    f = request.files['image']
    f.save('./static/demo.jpg')

    return 'post请求成功'

post请求视图函数

在这里插入图片描述

上传文件

在这里插入图片描述

在这里插入图片描述


八、response响应

  1. 重定向 return redirect

  2. 返回JSON格式 return jsonify

  3. 自定义响应 response,status,headers

  4. 返回模板 return render_template

1.重定向

# 重定向
@app.route('/san_ha')
def SanHa():
    return redirect('https://aweia.blog.csdn.net/')

在这里插入图片描述

2.返回JSON格式

# 响应JSON数据
@app.route('/json')
def json():
    json_data = {
        'id': 1001,
        'name': 'zhang san'
    }
    return jsonify(json_data)

在这里插入图片描述

3.自定义响应

# 3.自定义响应 响应由三部分组成:response,headers
@app.route('/response')
def myResponse():
    # 自定义一个响应(元组) 响应由三部分组成:response,headers
    return '自定义响应内容', 600, {'my_parm': 'python-3.8'}


@app.route('/response1')
def myResponse1():
    resp = make_response('make response 响应内容')  # 响应内容
    resp.status = '404 Not Found'  # 响应状态
    resp.headers['my_parm'] = 'python-3.8'  # 响应头
    return resp

在这里插入图片描述

在这里插入图片描述

4返回模板

# 4.返回模板
@app.route('')
def template(name, age):
    return render_template('index.html', name='bei ji de san ha', age=22)

在这里插入图片描述


10response响应.py

# -*- coding: utf-8 -*-
# @File  : 10response响应.py
# @author: 北极的三哈
# @email : Flymeawei@163.com
# @Time  : 2022/12/4 17:43
""""""
from flask import Flask, jsonify, make_response, render_template

app = Flask(__name__, static_folder='static')


@app.route('/helloworld')
def hello_world():  # put application's code here
    return 'Hello World!'


# 1.重定向
@app.route('/san ha')
def SanHa():
    return redirect('https://aweia.blog.csdn.net/')


# 2.响应JSON数据
@app.route('/json')
def json():
    json_data = {
        'id': 1001,
        'name': 'zhang san'
    }
    return jsonify(json_data)


# 3.自定义响应 响应由三部分组成:response, {'my_parm': 'python-3.8'}


@app.route('/response1')
def myResponse1():
    resp = make_response('make response 响应内容')  # 响应内容
    resp.status = '404 Not Found'  # 响应状态
    resp.headers['my_parm'] = 'python-3.8'  # 响应头
    return resp


# 4.返回模板
@app.route('/template')
def template():
    return render_template('index.html', age=22)


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>
    <h1 style="color: red">模板中动态数据</h1>
    name:{{ name }} <br>
    age:{{ age }}
</body>
</html>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Jinja2:是Python的Web项目中被广泛应用的模板引擎,是由Python实现的模板语言,Jinja2 的作者也是 Flask 的作者。他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。
监听QQ消息并不需要我们写代码,因为市面上已经有很多开源QQ机器人框架,在这里我们使用go-cqhttp官方文档:go-cqhttp如果您感兴趣的话,可以阅读一下官方文档,如果不想看,直接看我的文章即可。
【Flask框架】—— 视图和URL总结
python+web+flask轻量级框架的实战小项目。登录功能,后续功能可自行丰富。
有了这个就可以配置可信IP,关键是不需要企业认证,个人信息就可以做。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。基础薄弱的同学请戳Flask官方文档教程 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。 如果python都完全不熟悉,一定不要着急学习框架,请首先学习python官方文档,一步一个脚印。要不然从入门到放弃是大概率事件。 Python 官方文档教程
快到年末了 相信大家都在忙着处理年末数据 刚好有一个是对超市的商品库存进行分析的学员案例 真的非常简单~
一个简易的问答系统就这样完成了,当然,这个项目还可以进一步完善,比如 将数据存入Elasticsearch,通过它先进行初步的检索,然后再通过这个系统,当然我们也可以用其他的架构实现。如果你对这系统还有其他的疑问,也可以再下面进行留言!!!
#模版继承和页面之间的调用@app.route(&quot;/bl&quot;)def bl(): return render_template(&quot;file_2.html&quot;)主ht
#form表达提交@app.route(&quot;/data&quot;,methods=[&#39;GET&#39;,&#39;POST&#39;]) #methods 让当前路由支持GET 和
#form表达提交@app.route(&quot;/data&quot;,methods=[&#39;GET&#39;,&#39;POST&#39;]) #methods 让当前路由支持GET 和
#session 使用app.secret_key = &quot;dsada12212132dsad1232113&quot;app.config[&#39;PERMANENT_SESSION_LI
#文件上传@app.route(&quot;/file&quot;,methods=[&#39;GET&#39;,&#39;POST&#39;])def file(): if request.meth
#跳转操作:redirect@app.route(&quot;/red&quot;)def red(): return redirect(&quot;/login&quot;)
#session 使用app.secret_key = &quot;dsada12212132dsad1232113&quot;app.config[&#39;PERMANENT_SESSION_LI
@app.route(&quot;/req&quot;,methods=[&#39;GET&#39;,&#39;POST&#39;])def req(): print(request.headers)
#模版继承和页面之间的调用@app.route(&quot;/bl&quot;)def bl(): return render_template(&quot;file_2.html&quot;)主ht
#文件操作:send_file,支持图片 视频 mp3 文本等@app.route(&quot;/img&quot;)def img(): return send_file(&quot;1.jpg&q