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

news2024/12/26 12:46:05

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构建服务

from flask import Flask
# 创建flask对象
app = Flask(__name__)

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


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

使用werkzeug构建服务

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

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()

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    登录
</body>
</html>

jsonify返回json数据

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方式提交的参数

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()

<!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>
<!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登录验证功能

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 

<!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

<!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 

<!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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2265847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue2父组件调用子组件方法之slot的使用】

父组件调用子组件方法之slot的使用 具体功能需求&#xff1a; 一个页面&#xff0c;点击按钮&#xff0c;打开一个弹窗。弹窗有自定义表单和公共表单&#xff0c;提交的时候要获取两个表单的数据以及复显表单数据 为什么使用插槽了&#xff0c;因为我需要在弹窗中复用公共表单…

认识计算机网络

单单看这一个词语&#xff0c;有熟悉又陌生&#xff0c;让我们来重新认识一下这位大角色——计算机网络。、 一、是什么 以及 怎么来的 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路和通信设备连接起来&#xff0c;在网络操…

GitLab部署到阿里云服务器上

GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。 一、安装 1.创建一…

windows nacos安装配置

GitHub下载压缩包 解压目录&#xff08;注意不要用中文路径&#xff09; 在mysql先创建数据库nacos&#xff0c;再执行sql脚本 配置数据库 #*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: ### Deprecated conf…

ChildLife“童年时光杯”足球联赛启动 共促青少年健康成长

2024年12月21日至22日&#xff0c;由美国知名婴幼儿营养品牌ChildLife童年时光赞助的“童年时光杯”青少年足球联赛将在上海拉开帷幕。本次赛事U7/U8组别共有16支足球队参赛&#xff0c;包括上海幸运星足球俱乐部旗下的明星球队&#xff0c;以及其他青少年俱乐部的优秀队伍&…

动态规划<四> 回文串问题(含对应LeetcodeOJ题)

目录 引例 其余经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 引例 OJ 传送门Leetcode<647>回文子串 画图分析&#xff1a; 使用动态规划解决 原理&#xff1a;能够将所有子串是否是回文的信息保存在dp表中 在使用暴力方法枚举出所有子串&#xff0c;是…

Log4j1.27配置日志输出级别不起效

起因&#xff1a;构建独立版本debezuim使用时&#xff0c;日志一直打印debug信息。 原因&#xff1a;包冲突问题&#xff0c;进行排包操作。 参考log4j日志级别配置完成后不生效 系统一直打印debug日志_log4j不起作用-CSDN博客 1、application.properties logging.configc…

探索Flink动态CEP:杭州银行的实战案例

摘要&#xff1a;本文撰写自杭州银行大数据工程师唐占峰、欧阳武林老师。将介绍 Flink 动态 CEP的定义与核心概念、应用场景、并深入探讨其技术实现并介绍使用方式。主要分为以下几个内容&#xff1a; Flink动态CEP简介 Flink动态CEP的应用场景 Flink动态CEP的技术实现 Flin…

Git多人协作流程与git命令

目录 一、拉取&#xff1a;从仓库到本地1、第一次拉取2、后续的拉取 二、上传&#xff1a;从本地到仓库三、git commit版本信息标注 一、拉取&#xff1a;从仓库到本地 1、第一次拉取 # clone项目 git clone xxx2、后续的拉取 第一次拉取是指本地为空&#xff0c;如果本地已…

前端:改变鼠标点击物体的颜色

需求&#xff1a; 需要改变图片中某一物体的颜色&#xff0c;该物体是纯色&#xff1b; 鼠标点击哪个物体&#xff0c;哪个物体的颜色变为指定的颜色&#xff0c;利用canvas实现。 演示案例 代码Demo <!DOCTYPE html> <html lang"en"><head>&l…

[Unity] ShaderGraph动态修改Keyword Enum,实现不同效果一键切换

上次更新已然四个月前&#xff0c;零零散散的工作结束&#xff0c;终于有时间写点东西记录一下~ 实际使用中&#xff0c;经常会碰到同一个对象需要切换不同的材质&#xff0c;固然可以通过C#直接替换材质球。 或者在ShaderGraph中使用Comparison配合Branch实现切换&#xff…

电脑出现 0x0000007f 蓝屏问题怎么办,参考以下方法尝试解决

电脑蓝屏是让许多用户头疼的问题&#xff0c;其中出现 “0x0000007f” 错误代码更是较为常见且棘手。了解其背后成因并掌握修复方法&#xff0c;能帮我们快速恢复电脑正常运行。 一、可能的硬件原因 内存问题 内存条长时间使用可能出现物理损坏&#xff0c;如金手指氧化、芯片…

深度学习中的并行策略概述:1 单GPU优化

深度学习中的并行策略概述&#xff1a;1 单GPU优化 1 Training Larger Models on a Single GPU 在讨论模型的“扩展”时&#xff0c;往往会想到在多个GPU或多台机器上进行模型训练。不过&#xff0c;即便是在单个GPU上&#xff0c;也存在多种方法来训练更大规模的模型并提升…

数据结构(哈希表(中)纯概念版)

前言 哈希表&#xff08;Hash Table&#xff09;是计算机科学中的一个基础而重要的数据结构&#xff0c;它广泛评估各种算法和系统中&#xff0c;尤其是在需要快速查找、插入和删除操作的场景中。由于其O( 1)的平均时间复杂度&#xff0c;存储表在性能要求较高的应用中表现得非…

centos7的磁盘扩容

1、首先&#xff0c;确认你的磁盘是否已经正确识别并添加了新的空间。你可以使用lsblk或fdisk -l命令来查看 lsblk fdisk /dev/vda 2、我的情况是这样的&#xff0c;误操作将盘扩展为物理卷轴了&#xff0c;所以说是这样呈现的&#xff0c;如果有我的那种情况请先删除物理卷轴…

uniapp 微信小程序 页面部分截图实现

uniapp 微信小程序 页面部分截图实现 ​ 原理都是将页面元素画成canvas 然后将canvas转化为图片&#xff0c;问题是我页面里边本来就有一个canvas&#xff0c;ucharts图画的canvas我无法画出这块。 ​ 想了一晚上&#xff0c;既然canvas最后能转化为图片&#xff0c;那我直接…

ubuntu笔记

1.系统下载与虚拟机设置 系统下载https://cn.ubuntu.comhttps://releases.ubuntu.com 虚拟机设置: 桥接模式 在桥接模式下, 虚拟出来的操作系统就像是局域网中的一台独立的主机, 它可以访问网内任何一台机器主机网卡和虚拟网卡的IP地址处于同一个网段, 子网掩码、网关、DNS等…

音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

开发高效实时美颜工具:从美颜SDK到直播APP插件的全流程解析

今天&#xff0c;小编将以美颜SDK为核心&#xff0c;从开发、集成到优化的全流程&#xff0c;深入解析高效实时美颜工具的实现路径。 一、美颜SDK的核心功能与技术构成 美颜SDK是实时美颜技术的核心模块&#xff0c;承担着图像处理和效果呈现的重任。其主要功能包括&#xff…

用 gdbserver 调试 arm-linux 上的 AWTK 应用程序

很多嵌入式 linux 开发者都能熟练的使用 gdb/lldb 调试应用程序&#xff0c;但是还有不少朋友在调试开发板上的程序时&#xff0c;仍然在使用原始的 printf。本文介绍一下使用 gdbserver 通过网络调试开发板上的 AWTK 应用程序的方法&#xff0c;供有需要的朋友参考。 1. 下载 …