flask的使用学习笔记1

跟着b站学的1-06 用户编辑示例_哔哩哔哩_bilibili

flask是一个轻量级,短小精悍,扩展性强,可以扩展很多组件,django大而全

编程语言它们的区别:

(这些语言都很了解,java和python是高级语言,都是由c语言开发的

c 很多语言的底层语言都是c,代码执行效率高,需要自己做内存管理,如果忘记销毁,,对代码要求比较高,很多功能需要手动实现

下面的,都帮助了做内存管理

c# 是微软开发的,部署需要放在windows server,正版需要花钱,很优雅

php 擅长写网页,快速搭建一个网站

java 面向对象,很多企业级应用都会选择java,

python 简洁,很快入门,在爬虫、机器学习、自动化有优势,有很多库,

go lang 语法和c接近,在处理并发有优势,保留了很多直接调用c语言实现的功能,docker是容器

如果遇到java题,不会可以用python,不能空着

构造函数和析构函数

构造函数:用于创建对象的函数

析构函数:用于销毁对象的函数

class people()

        def _new_(self,*args,**kwargs):#构造函数

                pass

        #没写,但默认有 

        def _del_(self,*args,**kwargs):#析构函数

                pass

obj=people()

del obj #销毁对象

重写和重载

创建: 

manage.py和一个和项目名称相同的目录(static(前端生成的dist)、templates(html文件)、views里边有xx.py和__init__.py蓝图)

蓝图,构建目录结构

创建蓝图对象

使用

创建一个实例对象__name__可以写其它字符串,但一般是它

 浏览器将请求给web服务器,web服务器将请求给app , app收到请求,通过路由找到对应的视图函数,然后将请求处理,得到一个响应response 然后app将响应返回给web服务器, web服务器返回给浏览器

路由和视图函数, 处理url和函数之间关系的程序,称为路由

在@app.route('/login',methods=['GET','POST'])就能接收POST请求

(get请求一般是去取获取数据,参数会放在url中 

 post请求一般是去提交数据,请求数据是放在body中)

request.method=='GET'#判断请求类型

render_template

从模版文件夹templates中呈现给定的模板上下文,可以跟参数,xx=xx或**{"xx":xx}

endpoint是别名 没有则默认函数名不能重名 ,redirect(url_for('idx别名'))

login.html  直接用{{}}获取值

 <form> 元素 表示文档中的一个区域,此区域包含交互控件,用于向 Web 服务器提交信息

<input type="text" name="user">输入框的名称

jsonify

后端一般返回前端的数据就是json格式的响应数据,json格式的响应数据实际上是一个字符串

request.form

获取以POST方式提交的数据

request.form.get("user")方法根据表单元素的名称获取它的值

@auth 、@app.route是装饰器

redirect("/index") 执行路由A的时候会跳转执行路由B

装饰器

装饰器是给现有的模块增添新的小功能,可以对原函数进行功能扩展
而且还不需要修改原函数的内容,也不需要修改原函数的调用
import functools
@functools.wraps(func) #不加上这个,打印的值不是函数名,而是inner

两个装饰器,先运行auth1

会话:session

登录成功 要保留会话 让index内容需要成功登录才能看到秘密内容

flask的session保存在:以加密形式保存在浏览器的cookie

需要app.secret_key

index和edit

nid = request.args.get('nid')

index.html

表格标签 border是表格线 tr行标签 th列头标签 td列标签

循环{% for key in xx.items() %}

{% endfor %}

获取值value['name'] value.name value.get('name')

<a href="/edit?nid={{key}}">编辑</a>

  # ?nid={{key}}以nid的方式传参

获取参数request.args.get('nid')

edit.html

delete

整个代码

app.py

from flask import Flask,render_template,jsonify,request,redirect,url_for,session
import functools
#template_folder模板存放路径,默认为templates
app=Flask(__name__,template_folder="templates")
#session需要用到
app.secret_key='hggdxbt6t78ujkmoko'
DATA_DICT={#字典 全局变量
    1:{'name':'dog','age':'2'},
    2:{'name':'cat','age':'3'},
    3:{'name':'sheep','age':'8'},
    4:{'name':'pig','age':'5'},
}
#装饰器
def auth(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        username = session.get('xxx')
        if not username:
            return redirect('/login')
        return func(*args,**kwargs)
    return inner

#在内部读取login 的url 再读取下面的函数,生成对应关系
@app.route('/login',methods=['GET','POST'])
#只能接收get请求 这样就能接收post了
def login():
    #判断请求类型
    if request.method=='GET':
        #return "login"
        return render_template("login.html")
        #login.htm 模板需要放在templates目录
        #return jsonify({"code":1000,"data":[1,2,3]})
        #字典
    #拿请求体传传过来的值
    print(request.form)
    user = request.form.get("user")
    pwd = request.form.get("pwd")
    if user == "zhangsan" and pwd == "123456":
        # 登录成功 要保留会话 让index内容需要成功登录才能看到
        # 不用session会 直接输网址会访问字典并修改
        # session的会话信息会保存在浏览器不是服务端
        session['xxx'] = 'zhangsan'
        return redirect("/index")
        # 跳转到新的一个页面
    #登陆失败
    error="用户名或密码错误"
    #return render_template("login.html",**{"error":error})
    #**打散
    return render_template("login.html", error=error)
    #自动放在字典里了
#endpoint是别名 没有则默认函数名不能重名
@app.route('/index',endpoint='idx')
@auth
def index():
    #判断
    data_dict=DATA_DICT
    return render_template('index.html',data_dict=data_dict)
#编辑
@app.route('/edit',methods=['GET','POST'])
@auth
def edit():
    nid = request.args.get('nid')
    nid = int(nid)
    if request.method == 'GET':
        #获取index.html中字典的ID参数 是字符串类型
        #弄一个页面
        info = DATA_DICT[nid]
        return render_template('edit.html',info=info)
    #获取ID的值
    #取POST请求的值 获取名称为 name和age输入框的值
    name = request.form.get('name')
    age = request.form.get('age')
    DATA_DICT[nid]['name']=name
    DATA_DICT[nid]['age']=age
    return redirect(url_for('idx'))

#删除
#/del/<int:nid> 在del后面可以接收一个值,并转换为int类型
#/del/<nid>会默认为字符串类型
@app.route('/del/<int:nid>')
@auth
def delete(nid):
    #删除
    del DATA_DICT[nid]
    #return redirect('/index')
    #别名
    return redirect(url_for('idx'))
#装饰器

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

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
      <h3>用户列表</h3>
      <!--表格标签  border是表格线 tr行标签 th列头标签-->
      <table border="1">
         <!--显示字典内容-->
        <thead>
          <tr>
            <th>ID</th>
            <th>用户名</th>
            <th>年龄</th>
            <th>操作</th>
          </tr>
        </thead>
        <tbody>
        <!--在这里items是函数,加上()会返回迭代器,才能遍历
        value['name'] value.age value.get('age','10')
        如果没有age的值。默认为10
        都能获得字典的内容
        td列标签
        -->
          {#这样的注释才对 <!---->是html的注释 #}
          {# #}
          {% for key,value in data_dict.items() %}
            <tr>
              <td>{{key}}</td>
              <td>{{value['name']}}</td>
              <td>{{value.get('age','10')}}</td>
              <td>
                <!--传递一些url
                ?nid={{key}}以nid的方式传参-->
                <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>
    <h3>用户登录</h3>
    <!--表单-->
    <form method="POST">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <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>
    <h3>修改</h3>
    <!--提交是POST请求
    默认往当前页面提交 /edit/?nid=1-->
    <form method="post">
      <input type="text" name="name" value="{{info.name}}">
      <input type="text" name="age" value="{{info.age}}">
      <input type="submit" name="提交">
    </form>
</body>
</html>

运行结果:

问题:

当前无法使用此页面,127.0.0.1 重定向次数过多

参考网页无法正常运作127.0.0.1 将您重定向的次数过多。 尝试清除 Cookie. ERR_TOO_MANY_REDIRECTS---Django遇到的此状况的解决办法-CSDN博客

因为user获取失败(或者==None)会重定向无限循环导致的,每次重定向又会发送一个请求,满足重定向的条件循环

是因为login函数,不需要装饰器@auth

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动手做一个最小Agent——TinyAgent!

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 前 言 大家好&#xff0c;我是不要葱姜蒜。在ChatGPT横空出世&#xff0c;夺走Bert的桂冠之后&#xff0c;大模型愈发地火热&#xff0c;国内各种模型层出不穷&#xff0c;史称“百模大战”。大模型的能力是毋…

UE4几个常用节点链接

UE4几个常用节点链接 2017-12-02 12:54 1. 流光材质(及uv平铺次数) 2. 跑九宫格 3.闪光3。1 粒子闪烁效果 4.图案重复5.平移扭曲 6.溶解 刀光的uv滚动图片源或采样节点属性里改成clamp无后期发光光晕anistropic 各向异性高光法线图 法线图叠加 blendangle orrectedNo…

探索设计模式的魅力:揭秘B/S模式在AI大模型时代的蜕变与进化

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 揭秘B/S模式在AI大模型时代的蜕变与进化 &#x1f680;在AI的波澜壮阔中&#xff0c;B/S模式&…

为 AI 而生的编程语言「GitHub 热点速览」

Mojo 是一种面向 AI 开发者的新型编程语言。它致力于将 Python 的简洁语法和 C 语言的高性能相结合&#xff0c;以填补研究和生产应用之间的差距。Mojo 自去年 5 月发布后&#xff0c;终于又有动作了。最近&#xff0c;Mojo 的标准库核心模块已在 GitHub 上开源&#xff0c;采用…

面试题:JVM 调优

一、JVM 参数设置 1. tomcat 的设置 vm 参数 修改 TOMCAT_HOME/bin/catalina.sh 文件&#xff0c;如下图 JAVA_OPTS"-Xms512m -Xmx1024m" 2. springboot 项目 jar 文件启动 通常在linux系统下直接加参数启动springboot项目 nohup java -Xms512m -Xmx1024m -jar…

前端html+css+js常用总结快速入门

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 学习前端全套所有技术性价比低下且容易忘记&#xff0c;先入门学会所有基础的语法&#xff08;cssjsheml&#xff09;&#xff…

Valkey是一个新兴的开源项目,旨在成为Redis的替代品,背后得到了AWS、Google、Oracle支持

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Windows 禁用 Defender

原文&#xff1a;https://blog.iyatt.com/?p8078 2024.4.4 Windows 11 专业版 23H2 Beta 预览版 进入安全中心&#xff0c;关闭所有&#xff0c;特别是篡改防护选项 打开注册表 地址栏粘粘路径 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defende…

Rust线程间通信通讯channel的理解和使用

Channel允许在Rust中创建一个消息传递渠道&#xff0c;它返回一个元组结构体&#xff0c;其中包含发送和接收端。发送端用于向通道发送数据&#xff0c;而接收端则用于从通道接收数据。不能使用可变变量的方式&#xff0c;线程外面修改了可变变量的值&#xff0c;线程里面是拿不…

使用libibverbs构建RDMA应用

本文是对论文Dissecting a Small InfiniBand Application Using the Verbs API所做的中英文对照翻译 Dissecting a Small InfiniBand Application Using the Verbs API Gregory Kerr∗ College of Computer and Information ScienceNortheastern UniversityBoston, MAkerrgccs…

RAG原理、综述与论文应用全解析

1. 背景 1.1 定义 检索增强生成 (Retrieval-Augmented Generation, RAG) 是指在利用大语言模型回答问题之前&#xff0c;先从外部知识库检索相关信息。 早在2020年就已经有人提及RAG的概念&#xff08;paper&#xff1a;Retrieval-augmented generation for knowledge-inten…

UE4_材质节点

UE4_材质节点 2017-12-07 13:56 跑九宫格 跑UV 评论(0)

AI技术助推汽车行业走向更光明的未来

我们在汽车上度过的时间很多&#xff0c;有时候由于交通、天气和其他路况问题&#xff0c;我们在汽车上度过的时间之久甚至会出乎意料。正因如此&#xff0c;保障旅途体验的舒适和安全就显得至关重要。交通事故每天都会发生&#xff0c;因此在车辆中采取额外的安全措施对于所有…

Windows下用CMake编译PugiXML及配置测试

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 PugiXML是什么&#xff1f; PugiXML 是一个用于解析和操作 XML 文档的 C 库。它提供了简单易用的接口&#xff0c;能够高效地加载…

0基础安装配置Linux-ubuntu环境

Vmtools的安装参见 0基础教你安装VM 17PRO-直接就是专业许可证版_vm17许可证-CSDN博客 在vmtools中安装ubuntu 等待安装 这时候发现没有继续按钮&#xff0c;我们关闭这个界面&#xff0c;进入系统中&#xff0c;先更改分辨率 点击这个三角&#xff0c;因为还么有安装成功&am…

WSJ0源数据处理,wv转换为wav

WSJO数据集原始 文件.wv1&.wv2转换成wav文件 ​ 最近做语音分离实验需要用到wsj0-2mix数据集&#xff0c;但是从李宏毅语音分离教程里面获取的wsj0-2mix只有一部分。从网上获取到了完整的WSJO数据集后&#xff0c;由于原始的语音文件后缀是wv1或者wv2&#xff0c;创建wsj0…

Java 7、Java 8常用新特性

目录 Java 8 常用新特性1、Lambda 表达式2、方法引用2.1 静态方法引用2.2 特定对象的实例方法引用2.3 特定类型的任意对象的实例方法引用2.4 构造器引用 3、接口中的默认方法4、函数式接口4.1 自定义函数式接口4.2 内置函数式接口 5、Date/Time API6、Optional 容器类型7、Stre…

稀疏矩阵的三元组表表示法及其转置

1. 什么是稀疏矩阵 稀疏矩阵是指矩阵中大多数元素为零的矩阵。 从直观上讲&#xff0c;当元素个数低于总元素的30%时&#xff0c;这样的矩阵被称为稀疏矩阵。 由于该种矩阵的特点&#xff0c;我们在存储这种矩阵时&#xff0c;如果直接采用二维数组&#xff0c;就会十分浪费…

Kubernetes(k8s)核心资源解析:Pod详解

Kubernetes核心资源解析&#xff1a;Pod详解 1、什么是Pod&#xff1f;2、Pod 的组成3、Pod 如何管理多个容器4、Pod 的网络5、Pod 的存储方式6、Pod 的工作方式6.1 自主式 Pod6.2 监控和管理 Pod6.3 Pod 的创建流程 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

基于单片机的测时仪系统设计

**单片机设计介绍&#xff0c;基于单片机的测时仪系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的测时仪系统设计是一个结合了单片机技术与测时技术的综合性项目。该设计的目标是创建一款精度高、稳定性强且…