flask_study学习笔记

2023-11-30 18:58:28 浏览数 (2)

flask_study

安装:

windows环境下:

使用pycharm创建一个新的虚拟环境,在env环境下使用pip install flask安装即可

Linux环境下:

见python爬虫笔记

使用

配置文件settings,在这个文件中保存所有的配置信息。

env:环境,一般时开发环境,生产环境,测试环境

debug:一般适用于开发,测试环境,可以及时更新代码,并且会将错误信息返回页面

变量的类型:

默认str(不包含斜杠的字符串)

有 int,float,path(包含斜杠的字符串),uuid(唯一标识符)

代码语言:javascript复制
from flask import Flask
from config import settings

app = Flask(__name__)
# print(app.config)
# # 因为默认的config配置文件有字典形式保存,所以可以通过key修改值
# app.config['DEBBUG'] = True
# 通过创建的setting文件和flask提供的from_object方法将配置文件读取
# 或者from_pyfile
app.config.from_pyfile('configsettings.py')


# app.config.from_object(settings)
dict_t = {
    'a': '12',
    'q': ('1', '2'),
    'w': {'d': 'ct'}
}


@app.route('/')
def index():
    return "hello world! 你好!"

# 上下两种方法等效,使用装饰器底层实现函数使用了add_url_rule
# def dex():
#     return '1'
# app.add_url_rule('/inx', view_func=dex)


# 接受变量,同时视图函数只能返回字符串,字典,元组,response对象,wsgi类型其余的都会报错
@app.route('/index/<key>')
def set_test(key):
    return dict_t.get(key)

@app.route('/test/<path:p>')
def path_test(p):
    return p

# 在路由中定义斜杠,无论请求的url是否带有斜杠都可以执行视图函数,如果请求的是有斜杠的,则浏览器执行了一次重定向。
@app.route('/test/')
def test():
    return 'test'

# 路由中,定义的路由没有以斜杠结尾,但请求的路由以斜杠结尾则会返回not found
@app.route('/ttt')
def ttt():
    return 'ttt'

# 手动定义返回的状态码
@app.route('/test1')
def test1():
    return 'test1', 404

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


if __name__ == "__main__":
    main()

补充:

路由转发的的优先级:越往上优先级越高。

当定义的路由以斜杠结尾,但请求的路由有没有斜杠结尾都可以实现请求。

在路由中定义斜杠,无论请求的url是否带有斜杠都可以执行视图函数,如果请求的是有斜杠的,则浏览器执行了一次重定向。

建议使用不以斜杠的路由定义。

response对象

对字符串而言,在底层上还是将字符串传入response对象,进行处理,返回给网页。

代码语言:javascript复制
from flask import Flask
from config import settings

app = Flask(__name__)
# print(app.config)
# # 因为默认的config配置文件有字典形式保存,所以可以通过key修改值
# app.config['DEBBUG'] = True
# 通过创建的setting文件和flask提供的from_object方法将配置文件读取
# 或者from_pyfile
app.config.from_pyfile('configsettings.py')


# app.config.from_object(settings)
dict_t = {
    'a': '12',
    'q': ('1', '2'),
    'w': {'d': 'ct'}
}


@app.route('/')
def index():
    return "hello world! 你好!"
# 对于字符串而言,上面实际是执行了下面的方法来实现
@app.route('/indexs')
def indexs();
	response = Response('hello world! 你好!')
	print(response.content_type) # 查看相应体的类型
    print(response.headers)		# 查看相应体的相应头
    print(response.status_code)	# 查看相应码
    print(response.status)		# 查看相应状态
    response.set_cookie('name', 'xxx')	# 设置响应响应的cookie
	return response

@app.route('/index/<key>')
def set_test(key):
    return dict_t.get(key)


@app.route('/test/<path:p>')
def path_test(p):
    return p


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


# 手动设置状态码
@app.route('/test1')
def test1():
    return 'test1', 404


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

# 设置端口号,debug模式
def main():
    app.run(host='127.0.0.1', port=8080, debug=True)


if __name__ == "__main__":
    main()
request对象

请求对象,客户端向服务器发送的请求。

代码语言:javascript复制
from flask import Flask, make_response, Request, request

app = Flask(__name__)
app.config.from_pyfile("config/settings.py")


@app.route('/index')
def index():
    # request对象,请求对象
    # 可以查看到request的请求头,url,请求路由,cookie信息等
    print(request.headers)
    print(request.url)
    print(request.path)
    print(request.base_url)
    res = make_response("asdasd")
    return res


def main():
    app.run(port=5002)


if __name__ == "__main__":
    main()
render_template

test.html

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
        div {
            border: 2px solid red;

        }
    </style>
</head>
<body>
<div>
    <!--使用name,在提交后执行action动作后,会在路由显示提交的内容-->
    <form action="/join2" method="get">
        <p><label>
            <input type="text" name="username" placeholder="name">
        </label></p>
        <p><label>
            <input type="text" name="address" placeholder="address">
        </label></p>
        <label>
            <input type="submit" value="up">
        </label>
    </form>
</div>
</body>
</html>

py

代码语言:javascript复制
from flask import Flask, make_response, Request, request, render_template

app = Flask(__name__)
app.config.from_pyfile("config/settings.py")


@app.route('/index')
def index():
    # request对象,请求对象
    # 可以查看到request的请求头,url,请求路由,cookie信息等
    print(request.headers)
    print(request.url)
    print(request.path)
    print(request.base_url)
    res = make_response("asdasd")
    return res


# 使用render_template方法将html文件转换成字符串并返回
@app.route('/join')
def join():
    r = render_template("test.html")
    return r


# html文件中,提交时自动跳转到join2路由
@app.route('/join2')
def join2():
    # 打印主路径
    print(request.path)
    # 打印全路径
    print(request.full_path)
    # 打印提交的参数,类似字典,通过key取值,对于get方法
    print(request.args)
    # 打印提交的参数,类似字典,通过key取值,对于post方法
    # print(request.form)
    return 'join ok'


def main():
    # 查看路由规则表
    print(app.url_map)
    app.run(port=8000)


if __name__ == "__main__":
    main()

注意:

在导入自定义的settings文件,或者使用render_template方法时,如果出现一直model not found或文件渲染一直有问题,可以在File | Settings | Project: flask_demo | Project Structure将项目文件夹把几种设置都勾选上。(原因暂时不清楚)

url_for和redirect

redirect用于重定向

代码语言:javascript复制
import json
from flask import Flask, make_response, Request, request, render_template, redirect, url_for

app = Flask(__name__)
app.config.from_pyfile("config/settings.py")
users = []


@app.route('/')
def index():
    return render_template('special.html')


@app.route('/register', methods=['POST', 'GET'], endpoint='indexs')
def register():
    if request.method == 'POST':
        name = request.form.get('username')
        pwd = request.form.get('password')
        re_pwd = request.form.get('repassword')
        if pwd == re_pwd:
            user = {'name': name, 'password': pwd}
            users.append(user)
            show_data = json.dumps(users)
            # return '注册成功'   show_data   '<a href="/">返回</a>'
            # 重定向,传入要定向的页面,可以设置状态码
            # url_for,根究传入的endpoint名称,返回对应路径
            return redirect(url_for('indexs'))
        else:
            return '密码不一致'
    return render_template('test.html')


if __name__ == '__main__':
    app.run(port=5002)
模板语法

在html界面中可以动态的获取后台传入的参数

代码语言:javascript复制
<!--模板语法的各种类型-->
    <h1>{{ name }}</h1>
    <h2>{{ age }}</h2>
    <h3>{{ friends.1 }}</h3>
    <h4>{{ t }}</h4>
代码语言:javascript复制
<!--模板语法控制块-->
<!--for 循环结构-->
<!--if 判断结构-->
    <ul>
<!--        {{ grils }}-->
        {% for girl in grils %}
            {% if girl|length  >= 3 %}
                <li> {{ girl }}</li>
            {% else %}
                <li class="color">{{ girl }}</li>
            {% endif %}
        {% endfor %}
    </ul>

对于获取循环时的行数,可以使用loop变量

index 从1开始计数行数,index0从0开始计数行数,revindex倒序计数,revindex0倒序0开始,first 是否是第一行, last 是否是最后一行

可以选择在行内进行if 判断语句

过滤器

本质上是函数,对于一些不能直接在模板语法中使用的python语法,被封装成了过滤器

例如 ;

xxx | safe 禁止转义

在讲一些带有标签的数据传入html文件时,不想进行转义,使用safe

xxx | capitalize

单词首字母大写

lower 和 upper

大小写的转换

title 将一句话的每个单词首字母大写

format 格式化输出

{{ ’%s is %d‘ | format(‘asd’, 18) }}

truncate 截断

列表的过滤器:

list | length 获取列表的长度 list | first, last 获取第一个或最后一个元素

sum, sort 对整型元素而言

字典的操作:

0 人点赞