flask前后端交互Demo-路由+蓝图+上下文对象+render_template+url_for返回页面展示参数的使用(2-基础篇-转载)

1.什么是路由

我们都知道从地址栏发送请求需要程序来执行,那么如何才能让地址栏发出的URL能走到我们的程序代码里呢,这时候就用到了路由,处理URL和python函数相映射关系的程序就叫做路由,简单来说就是让地址栏发出的URL通过路由能找到对应的函数做处理,这种处理过程是路由来完成的

举例说明:
在这里插入图片描述

  • 当我访问我的项目根路径的时候,视图函数就会给我返回一个字符串Hello World,那么这之间的映射关系就是路由做到的

2.什么是蓝图

我们通过上面的例子知道了路由的作用,那么一个大型项目中不可能所有的代码都写到一个文件中,那样及其难维护而且代码耦合性极高,那么如何降低耦合性呢,这时候就用到了蓝图,蓝图就是创建另一个不同名字的路由,但是可以通过把蓝图加载到主程序中一起执行,这样的话每个不同RUL前缀的视图函数就可以写在不同的文件中了,我的理解蓝图功能主要是降低代码耦合性,使其容易维护

举例说明:

  • 当前我们有一个主程序 app.py,我们创建一个蓝图
# 当前文件    : BlueprintDemo.py
"""
说明:  非常重要!
BluePrint第一个参数 Str类型 ,是蓝图的名字,此后使用flask框架 url_for()的时候要以这个名字点下面的函数
比如当前index视图函数,我使用url_for()的时候需要这样写参数  url_for('bluePrint.index') ,这样路由才能找得到你的函数
url_for()函数一般用于html页面的表单提交,a链接跳转
 
"""
from flask import Blueprint

blueprint = Blueprint("bluePrint", __name__)

# 注意这里route中填写的路径名字要和视图函数的名字一致
@blueprint.route("/index")
def index():
    return 'Hello World index2'


  • 主函数加载刚刚创建的蓝图
    在这里插入图片描述
from flask import Flask
from BlueprintDemo import blueprint
"""
说明:
url_prefix 属性是添加访问路径前缀,比如我们要访问blue蓝图下的index函数
那么我们的路径一定要写成 localhost:8200/blue/index  不然系统找不到
"""
app = Flask(__name__)
app.register_blueprint(blueprint,url_prefix='/blue')


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


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

  • 当我们在浏览器输入路径时,会跳转到bluePrint路由下的index视图函数
  • 路径的书写规则是: 主程序中注册的蓝图名称+请求的视图函数route中的路径名称
    在这里插入图片描述

3.什么是上下文对象

上下文对象其主要的作用就是保存程序交互中产生的数据,把这些数据放入相应的栈中,使得所有的函数都可以对上下文对象存储数据和共享数据

举例说明Session上下文对象:

  • 首先如下创建目录结构
  • 在这里插入图片描述
  • SessionDemo 文件内容如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/12/12 22:13
# @Author  : 宁宁小可爱
# @File    : SessionDemo.py
# @Software: PyCharm
from flask import Blueprint, session, render_template
"""
render_template: 作用就是返回一个页面,也可以携带参数
return render_template("Session.html",data=123) 表明携带参数为 key:data value:123 的参数到Session.html页面中 

如果只是想返回静态页面 .不需要jinja检查渲染,那么调用 send_from_directory函数
1. from flask import send_from_directory
2. html = os.path.join(os.path.dirname(os.path.abspath(__file__)), "templates")  # templates 是你存储html页面的文件夹名称
3. return send_from_directory(html, "show_data_every_day.html") 
"""
sessionBlp = Blueprint('session', __name__)

@sessionBlp.route('/addSession')
def addSession():
    session['name'] = 'tom'
    print('添加成功')
    return render_template('Session.html')

@sessionBlp.route('/getSession')
def getSession():
    try:
        Name = session['name']
        print('获取到的Session: {}'.format(Name))
    except KeyError:
        print('Session已经被删除,获取失败')
    return render_template('Session.html')

@sessionBlp.route('/delSession')
def delSession():
    session.pop('name')
    print('删除Session成功')
    return render_template('Session.html')


  • Session.html 文件内容如下
<!DOCTYPE html>
<html lang="en">
{
    
    #
说明:非常重要!!!
    @ url_for()函数是flask通过路由找你的视图函数的方式
    @ 当中的参数书写规则为:   你在蓝图中注册的路由名称.蓝图中对应的视图函数名称
    @ 比如:sessionBlp = Blueprint('session', __name__) session注册的蓝图名称为: session
    @ 你想请求的视图函数名 比如addSession 那么就书写成  {
    
    {
    
     url_for('session.addSession') }}
    @ 其中 {
    
    {
    
      }} 为flask模板的固定语法,一定要加 不然会404找不到资源
#}
<head>
    <meta charset="UTF-8">
    <title>Session上下文对象Demo</title>
</head>
<body>
<a href="{
    
    { url_for('session.addSession') }}">添加Session</a>
<a href="{
    
    { url_for('session.getSession') }}">获取Session</a>
<a href="{
    
    { url_for('session.delSession') }}">删除Session</a>
</body>
</html>

  • app.py 文件内容如下
import os

from flask import Flask, render_template
from SessionDemo import sessionBlp

"""
说明: 非常重要!!
    @ Session在使用之前必须设置Session的秘钥,不然使用不了,因为flask框架限制了,Session很容易在页面中被获取,为了安全考虑必须加密
    @ 设置Sessiion秘钥有两种方式
    @ 1.app.config['SESSION_KEY'] = '123456'            设置Session的秘钥为123456
    @ 2.app.secret_key = str(os.urandom(24))
    @ app.config['PERMANENT_SESSION_LIFETIME'] = 60     设置Session的生命周期为一分钟,一分钟后销毁

"""
app = Flask(__name__)
app.register_blueprint(sessionBlp, url_prefix='/session')
# 设置Session内容
app.config['SESSION_KEY'] = '123456'
app.secret_key = str(os.urandom(24))
app.config['PERMANENT_SESSION_LIFETIME'] = 60


@app.route('/')
def hello_world():
    return render_template("Session.html")


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


  • 复制粘贴完三个文件内容之后,启动项目在浏览器输入: localhost:8200/,会出现以下页面

在这里插入图片描述

  • 分别点击添加-获取-删除Session按钮,并观察控制台输出内容
    在这里插入图片描述
  • 由此简单小Demo就可以知道操作Sessino的方法了,Session的具体使用方法还请百度,这里不一一介绍

4.render_template返回页面的使用

flask模板的使用

在上述的例子中已经讲过了如何使用render_template和url_for返回到页面了,那么接下来讲解html页面如何使用flask模板循环判断展示参数

举例说明:

  • 添加如下文件
    在这里插入图片描述
  • Show.py 文件内容如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/12/12 22:56
# @Author  : 宁宁小可爱
# @File    : Show.py
# @Software: PyCharm
from flask import Blueprint, render_template
"""
注意:
    @ 传的参数userList前面红色字段,必须要和目标html做循环的字段保持一致
    @ 不然会找不到数据无法正常响应
"""

show = Blueprint('show', __name__)

@show.route('/showData')
def showData():
    userList = [{
    
    'name': 'tom', 'sex': '男', 'job': '程序员', 'email': '[email protected]'},
                {
    
    'name': 'jack', 'sex': '男', 'job': '调酒师', 'email': '[email protected]'},
                {
    
    'name': 'rose', 'sex': '女', 'job': '气氛组', 'email': '[email protected]'},
                {
    
    'name': 'luna', 'sex': '女', 'job': '保安', 'email': '[email protected]'}]
    return render_template('ShowUser.html', userList=userList)


  • ShowUser.html 文件内容如下
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户信息</title>
</head>
<body>
    <table border="1" width="60%" bgcolor="#e9faff" cellpadding="2">
        <caption>用户信息</caption>
        <tr align="center">
            <td>用户名</td>
            <td>性别</td>
            <td>职业</td>
            <td>邮箱</td>
        </tr>

    {
    
    #
        我在这里加了判断 如果名字等于 tom 那么就变成中文的汤姆 !!!!!!!
        if 语法展示
    #}
        {
    
    % for user in userList %}
            <tr align="center">
                {
    
    % if user.name == 'tom' %}
                    <td>汤姆</td>
                    <td>{
    
    {
    
     user.sex }}</td>
                    <td>{
    
    {
    
     user.job }}</td>
                    <td>{
    
    {
    
     user.email }}</td>
                {
    
    % else %}
                    <td>{
    
    {
    
     user.name }}</td>
                    <td>{
    
    {
    
     user.sex }}</td>
                    <td>{
    
    {
    
     user.job }}</td>
                    <td>{
    
    {
    
     user.email }}</td>
                {
    
    % endif %}
            </tr>

        {
    
    % endfor %}



    </table>
</body>
</html>

  • app.py 中注册蓝图
from flask import Flask, render_template

from Show import show

app = Flask(__name__)
app.register_blueprint(show, url_prefix='/show')

@app.route('/')
def hello_world():
    return render_template("Session.html")


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


  • 在浏览器中输入路径: localhost:8200/show/showData,出现下列结果即为正常
    在这里插入图片描述
    结语: 到此为止flask基本使用方法讲解了一下,下一篇讲进阶篇重定向,请求转发系列

转载自:https://blog.csdn.net/weixin_44232093/article/details/103517244

猜你喜欢

转载自blog.csdn.net/qq_47122804/article/details/121407940
今日推荐