Flask框架中常见的一些问题

1. 如何指定接收多个HTTP请求方法?

我们只需要在写路由时,在路由名后加上一个参数methods,即用列表将你可能使用的方法加入即可。
@app.route('/login/', methods=['GET', 'POST'])

2. 如何判断用户请求的HTTP方法?

需要导入request模块,并用其中的method方法就可以
if request.method == 'POST':

3. 如何获取用户POST请求提交的表单数据?

需要导入request模块,并用其中的form方法就可以
request.form   ##这个是直接获取所有的
user = request.form['user']   ###这个是获取html中标签名为user的

4. 模板渲染(jinja2)

1.使用模板的原因及用法

python的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html 文件)分开的, 使得代码的可读性增强, 代码容易理解和维护。由于python中生成html不易修改与维护, 所以将html的内容独立到templates目录中(一定要使用这个名字)

模板渲染: 在html文件中,通过动态赋值 , 将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。
其他的模板引擎: Mako, Template, Jinja2

方法:

1). 去当前项目目录下寻找templtes是否存在?再去判断templates目录下是否有login.html文件?
2). 读取这个login.html文件的内容, 作为render_template的返回值;
3). 最终返回给用户浏览器;

1.模板的表达式都是包含在分隔符”{{ }}”内的,表达式一般有以下情况:
在这里插入图片描述

2.控制语句都是包含在分隔符”{% %}”内的;
Jinja2的控制语句主要就是条件控制语句if,和循环控制语句for,语法类似于Python。
if控制语句要用”{% endif %}”来结束,同if语句一样,for控制语句要用”{% endfor %}”来结束。页面上,每个元素之间会有空格,如果你不希望有空格,就要在”for”语句的最后,和”endfor”语句的最前面各加上一个”-“号。

3.模板也支持注释,都是包含在分隔符”{# #}”内,支持块注释。

具体的用法将在下面的例子中使用到。

2. 过滤器与自定义过滤器

import time
from flask import Flask, render_template

app = Flask(__name__)


class User(object):
    def __init__(self, name, passwd):
        self.name = name
        self.passwd = passwd

    def __str__(self):
        return "<User: %s>" % (self.name)


# 自定义一个转换时间格式的过滤器

@app.route('/')
def index2():
    name = "      this is a message"
    li = [1, 2, 4, 5]
    d = dict(a=1, b=2)
    liDict = [
        {
            'count': 100,
            'price': 30
        },
        {
            'count': 110,
            'price': 20
        },

    ]
    u = User("westos", "passwd")
    timestamp = time.time()
    return render_template('index2.html',
                           name=name,
                           li=li,
                           d=d,
                           u=u,
                           liDict=liDict,
                           timestamp=timestamp
                           )


def format_date(value, format="%Y-%m-%d %H:%M:%S"):
    #  时间戳----> 元组
    ttime = time.localtime(value)
    # 元组 --- > 指定字符串
    return time.strftime("%Y-%m-%d %H:%M:%S", ttime)


app.add_template_filter(format_date, 'format_date')


@app.route('/index3/')
def index3():
    return render_template('index3.html',
                           timestamp=time.time())
app.run(port=5004)

3.宏macro的使用

使用这个,我们可以将在html中类型一样,参数不一样的标签使用宏表达出来,可以减少我们代码的重复量
{# 宏: 是一个函数 #}



{% macro input(type,  name, text ) %}

 <div class="form-group">
            <label>{{ text }}</label>
            <input name={{ name }} type={{ type }} class="form-control">
        </div>

{% endmacro %}

4.模板的继承

模板继承语法:
1. 如何继承某个模板?
        {% extends "模板名称" %}


2. 如何挖坑和填坑?
挖坑:
    {% block 名称 %}

        默认值

    {% endblock %}


填坑:
    {% block 名称 %}

    {% endblock %}


3. 如何调用/继承被替代的模板?
    挖坑:
    {% block 名称 %}

        默认值

    {% endblock %}


填坑:
    {% block 名称 %}
        #如何继承挖坑时的默认值?
        {{ super() }}

        # 后面写新加的方法.
        ........
    {% endblock %}

5. 重定向

redirect	 ###后跟路由名
render_template('login.html)   ## 后跟html 

6. 404处理

@app.errorhandler(404)
def not_found(e):
    return  render_template('404.html')


# 抛出异常
@app.route('/user/<int:user_id>/')
def user(user_id):
    if 0<int(user_id)<=100:
        return  "欢迎访问: %s" %(user_id)
    else:
        abort(404)

app.run(port=5002)

7.session操作

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。

该模块需要从flask包中导入

from flask import  Flask, session
import  random
app  = Flask(__name__)
app.config['SECRET_KEY'] =  random._urandom(24)   # 设置是24位的字符, 每次运行服务器的secret_key都是不同的,

# 服务器重启后会清除上一次存储的session信息值;


# 设置session值;
@app.route('/')
def index():
    # 如何设置session的key-value值
    session['name'] = 'westos'
    return "hello world"


@app.route('/get/')
def get():
    # 如何获取?
    return  session.get('name')
@app.route('/delete/')
def delete():
    # 如何删除?
    print(session.get('name'))
    session.pop('name')   ##删除
    print(session.get('name'))
    return  'delete'



app.run(port=5001)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

综合上述所有常见问题,我会将其用于一个例子中,做详细讲解。

例:用户的登陆,注册
首先在这里说一下我们如何创建一个较为标准的工程
1.创建一个名为static(一般都用这个名,但是你也可以换 )的目录,用来存放一些css样式和字体等
2.创建一个名为templates的目录,用来存放我们主页,登陆等一些html文件
3.再创建一个我们的主程序(一般命名为run.py

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/forever_wen/article/details/83348235