前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >flask_study学习笔记

flask_study学习笔记

作者头像
Echo_Wish
发布2023-11-30 18:58:28
1600
发布2023-11-30 18:58:28
举报
文章被收录于专栏:数据结构和算法

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('config\settings.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('config\settings.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>
image-20201125084950618
image-20201125084950618

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

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

image-20201125085138053
image-20201125085138053

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

image-20201125085730142
image-20201125085730142
过滤器

本质上是函数,对于一些不能直接在模板语法中使用的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 对整型元素而言

字典的操作:

image-20201125093141808
image-20201125093141808
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • flask_study
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档