1.flask介绍、入门、基本用法

flask与djiango的区别

djiango是一个大而全的框架。

djiango内部为我们提供了非常多的组件: orm/session/cookie/admin/form/modelform/路由/视图/模板/中间件/分页/auth/contenttype/缓存/信号/多数据库连接

flask 是一个轻量级的框架,本身没有什么太多的功能:路由/视图/模板jinja2/session/中间件,第三方组件非常齐全。

注意事项: djiango的请求是逐一封装和传递。flask请求是利用是上下文管理来实现的。

flask快速使用

安装命令

pip3 install flask

与此同时会安装 依赖 Jinja2 和 Werkzeug

wsgi-Werkzeug

模板-Jinja2

使用flask构建服务

python 复制代码
from flask import Flask
# 创建flask对象
app = Flask(__name__)

# 路由和视图函数放在一起
@app.route("/index")
def index():
    return "hello world"


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

使用werkzeug构建服务

python 复制代码
from werkzeug.serving import run_simple


def func(environ, start_response):
    print("请求来了")
    pass


if __name__ == '__main__':
    run_simple('127.0.0.1', 5000, func)

app.run()方法的源码如下得知:

得出结论:flask构建服务的底层就是使用的werkzeug构建服务。

1.flask框架是基于werkzeug的wsgi实现,flask自己没有wsgi。

2.用户请求一旦到来,就会执行app.__call__方法。

视图模板

默认的模板路径 templates

python 复制代码
from flask import Flask, render_template

app = Flask(__name__, template_folder="templates")


@app.route("/login")
def login():
    return render_template("login.html")


if __name__ == '__main__':
    app.run()
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    登录
</body>
</html>

jsonify返回json数据

python 复制代码
from flask import Flask, jsonify

app = Flask(__name__, template_folder="templates")


@app.route("/login")
def login():
    return jsonify({"code":200, "data":[1,2,3]})


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

简单的登录功能

request

redirect

render_template

request.method

request.form.get(变量名) 取表单变量的值,Post方式提交的参数

python 复制代码
from flask import Flask, render_template, request, redirect

app = Flask(__name__, template_folder="templates")


@app.route("/login", methods=["GET", "POST"])
def login():
    method = request.method
    if method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        if username == 'admin' and password == '123':
            return redirect("/index")
    error = '用户名密码错误'
    return render_template("login.html", error=error)


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


if __name__ == '__main__':
    app.run()
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form method="post">

        用户名:<input type="text" name="username" /><br/>
        密码:<input type="text" name="password" /><br/>
        <input type="submit" value="提交"><span style="color:red">{{error}}</span>
    </form>

</body>
</html>
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>首页</h1>

</body>
</html>

request.args.get( 变量名**) url地址上传递的参数,get方式传递的参数**

返回数据类型

1.return render_tempalte("模板文件")

2.return jsonfy({"name":"aa"})

3.return redirect("/index") or return redict(url_for("idx"))

4.return "xxx" # 返回字符串

完整版,简单的登录、首页、修改、删除、session登录验证功能

python 复制代码
from flask import Flask, render_template, request, redirect, url_for, session

app = Flask(__name__, template_folder="templates")
# 使用session时需要,值可以先随便写一个
app.secret_key = "12345"

# 定义一个全局变量来当做数据库
DATA_DICT = {
    1: {'name': '张三', 'age': 18, 'gender': '男'},
    2: {'name': '李四', 'age': 22, 'gender': '男'}
}


@app.route("/login", methods=["GET", "POST"])
def login():
    method = request.method
    if method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        if username == 'admin' and password == '123':
            session['xx'] = username
            return redirect("/index")
    error = '用户名密码错误'
    return render_template("login.html", error=error)


# endpoint给路由取了个别名,如果不指定,endpoint的默认值为函数名
# endpoint的值不能重名
@app.route("/index", endpoint="index_page")
def index():
    username = session.get('xx')
    if not username:
        # 如果未登录则跳转到登录页面
        return redirect("/login")
    return render_template("index.html", DATA_DICT=DATA_DICT)


@app.route("/edit", methods=['GET', "POST"])
def edit():
    username = session.get('xx')
    if not username:
        # 如果未登录则跳转到登录页面
        return redirect("/login")
    id = request.args.get('nid')
    id = int(id)
    if request.method == 'POST':
        name = request.form.get('name')
        age = request.form.get('age')
        gender = request.form.get('gender')
        DATA_DICT[id]['name'] = name
        DATA_DICT[id]['age'] = age
        DATA_DICT[id]['gender'] = gender
        return redirect(url_for("index_page"))
    info = DATA_DICT[id]
    return render_template("edit.html", info=info)


# 默认就是str类型,可以不写
@app.route("/del/<int:nid>")
def delete(nid):
    username = session.get('xx')
    if not username:
        # 如果未登录则跳转到登录页面
        return redirect("/login")
    print(f"nid={nid}")
    # 根据key删除dict的元素
    del DATA_DICT[nid]
    # 通过url_for来重定向跳转
    return redirect(url_for("index_page"))


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

index.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>首页</h1>

    <table border="1">
        <thead>
            <td>序号</td>
            <td>姓名</td>
            <td>年龄</td>
            <td>性别</td>
            <td>操作</td>
        </thead>
        <tbody>
        {% for key, value in DATA_DICT.items() %}
            <tr>
                <td>{{key}}</td>
                <td>{{value.get('name')}}</td>
                <td>{{value['age']}}</td>
                <td>{{value.gender}}</td>
                <td>
                    <a href="/edit?nid={{key}}">编辑</a>
                    <a href="/del/{{key}}">删除</a>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>

</body>
</html>

login.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form method="post">

        用户名:<input type="text" name="username" /><br/>
        密码:<input type="text" name="password" /><br/>
        <input type="submit" value="提交"><span style="color:red">{{error}}</span>
    </form>

</body>
</html>

edit.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑</title>
</head>
<body>
    <form method="post">
        <input type="text" name="name" value="{{info.name}}"><br/>
        <input type="text" name="age" value="{{info.age}}"><br/>
        <input type="text" name="gender" value="{{info.gender}}"><br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
相关推荐
迅猛龙办公室6 小时前
python实现倒序输出数字
开发语言·python
全栈练习生15 小时前
AI Agent 沙箱
python·ai
智码看视界16 小时前
Edge AI 全栈实战 ⑤:云边协同收尾——MQTT 桥接 + 云端看板管 N 台边缘设备
mqtt·flask·iot·全栈开发·云边协同·edgeai
SEO_juper16 小时前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗
开发语言·人工智能·爬虫·python·seo·外贸独立站
用户83562907805117 小时前
使用 Python 对 Excel 工作表进行排序
后端·python
for_ever_love__18 小时前
MySQL 全文索引实战:FULLTEXT、ngram 中文分词与 MATCH AGAINST 到底该怎么用
java·python·mysql·全文检索·分词·索引·ngram
用户83562907805118 小时前
使用 Python 合并 PowerPoint 演示文稿
后端·python
weixin_4617694018 小时前
VS Code 中创建 Jupyter 文件(.ipynb)
ide·python·jupyter
2601_9669496518 小时前
多市场量化策略的数据接口应该如何设计:从数据层架构到策略接入
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
全栈弄潮儿18 小时前
Python实战第1期:Python环境搭建与第一个程序
python