flask的使用学习笔记1

news2024/11/18 11:17:43

跟着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

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

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

相关文章

Xen Server 8 Install

Xen Sevrer 前言 XenServer&#xff08;以前称为 Citrix Hypervisor&#xff09;是业界领先的平台&#xff0c;实现了经济高效的桌面、服务器和云虚拟化基础结构。XenServer 支持任意规模或类型的组织整合计算资源&#xff0c;以及将计算资源转换为虚拟工作负载&#xff0c;从…

Google Chrome 常用设置

Google Chrome 常用设置 References 转至网页顶部 快捷键&#xff1a;Home 转至内容设置 chrome://settings/content 清除浏览数据 历史记录 -> 清除浏览数据 关于 Chrome 设置 -> 关于 Chrome chrome://settings/help References [1] Yongqiang Cheng, https:/…

Postman和Python Request测试多行Form-data

1、请求参数有多个&#xff0c;F12查看请求体如下&#xff1a; 查看源代码&#xff1a; ------WebKitFormBoundaryHknGXm9VkhRUXZYC Content-Disposition: form-data; name"custId"IICON004 ------WebKitFormBoundaryHknGXm9VkhRUXZYC Content-Disposition: form-da…

算法整理:排序

快速排序 首先不妨以第一个数为基准数&#xff0c;在一轮遍历后&#xff0c;使基准数左边的数都小于基准数&#xff0c;基准数右边的数都大于基准数。 当然也可以取中间的数为基准数。 void quick_sort(vector<int>&nums,int l,int r){if(l>r)return;int idxl;//…

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

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

LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】

LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】 题目描述&#xff1a;解题思路一&#xff1a;双向链表&#xff0c;函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。一张图&#xff1a;知识点__slots__ 解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&am…

java Web 健身管理系统idea开发mysql数据库LayUI框架java编程计算机网页源码maven项目

一、源码特点 java Web健身管理系统是一套完善的信息管理系统&#xff0c;结合java 开发技术和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 layUI bootst…

院内感染的相关因素分析(Boruta联合SHAP分析2)R

院内感染的相关因素分析&#xff08;Boruta联合SHAP分析2&#xff09;R 和鲸社区一键运行代码 院内感染是指住院患者在医疗机构内发生的感染&#xff0c;是医院管理中常见且严重的问题。院内感染不仅会延长患者住院时间&#xff0c;增加医疗费用&#xff0c;还会严重威胁患者生…

地表径流分布数据/水文站点分布/降雨量分布/辐射分布数据

引言 大气降水落到地面后&#xff0c;一部分蒸发变成水蒸气返回大气&#xff0c;一部分下渗到土壤成为地下水&#xff0c;其余的水沿着斜坡形成漫流&#xff0c;通过冲沟&#xff0c;溪涧&#xff0c;注入河流&#xff0c;汇入海洋。这种水流称为地表径流。 正文 数据简介 来自…

汉诺塔问题的递归算法解析

文章目录 汉诺塔问题的递归算法解析问题描述递归算法思路代码实现算法复杂度分析总结 汉诺塔问题的递归算法解析 问题描述 汉诺塔问题是一个经典的递归算法问题。问题描述如下&#xff1a; 在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘…

普联一面4.2面试记录

普联一面4.2面试记录 文章目录 普联一面4.2面试记录1.jdk和jre的区别2.java的容器有哪些3.list set map的区别4.get和post的区别5.哪个更安全6.java哪些集合类是线程安全的7.创建线程有哪几种方式8.线程的状态有哪几种9.线程的run和start的区别10.什么是java序列化11.redis的优…

《C Prime Plus》02

1. UNIX 系统 C语言因UNIX系统而生&#xff0c;也因此而流行&#xff0c;所以我们从UNIX系统开始&#xff08;注意&#xff1a;我们提到的UNIX还包含其他系统&#xff0c;如FreeBSD&#xff0c;它是UNIX的一个分支&#xff0c;但是由于法律原因不使用该名称&#xff09;。 UN…

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

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

备战蓝桥杯Day36 - 动态规划 - 三角形最小路径和问题

一、什么是动态规划 通过拆分问题&#xff0c;定义问题状态和状态之间的关系&#xff0c;使得问题能够以递推的方式解决。 哪些问题可以使用动态规划&#xff1f; 1、具有最优子结构&#xff1a;问题的最优解所包含的子结构的解也是最优的 2、具有无后效性&#xff1a;未来…

typdef:深入理解C语言中typdef关键词的用法

typedef&#xff1a;C语言中的类型重命名关键词 在C语言中&#xff0c;typedef 是一个非常有用的关键词&#xff0c;它允许我们为现有的数据类型定义一个新的名称。这不仅使得代码更加清晰易读&#xff0c;还提高了代码的可维护性。在这篇博客中&#xff0c;我们将深入探讨 ty…

0.17元的4位数码管驱动芯片AiP650,支持键盘,还是无锡国家集成电路设计中心某公司的

推荐原因&#xff1a;便宜的4位数码管驱动芯片 只要0.17元&#xff0c;香吗&#xff1f;X背景的哦。 2 线串口共阴极 8 段 4 位 LED 驱动控制/7*4 位键盘扫描专用电路 AIP650参考电路图 AIP650引脚定义

代码随想录第29天|491.递增子序列 46.全排列 47.全排列 II

目录&#xff1a; 491.递增子序列 46.全排列 47.全排列 II 491.递增子序列 491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 回溯算法精讲&#xff0c;树层去重与树枝去重 | LeetCode&#xff1a;491.递增子序列_哔哩哔哩_bili…

C语言——常用库函数的使用及模拟实现

C语言编译系统为使用者提供了很多的预定义库函数。用户在编写程序时&#xff0c;可以直接调用这些库函数。这里选择了一些常用的库函数&#xff0c;简单介绍各个函数的使用方法&#xff1a; 字符串函数 字符串函数函数分为长度不受限制的字符串函数&#xff0c;和长度受限制的…

图的应用解析

01&#xff0e;任何一个无向连通图的最小生成树(B )。 A.有一棵或多棵 B.只有一棵 C.一定有多棵 D.可能不存在 02.用Prim算法和Kruskal算法构造图的最小生成树&#xff0c…

每日一题————P5725 【深基4.习8】求三角形

题目&#xff1a; 题目乍一看非常的简单&#xff0c;属于初学者都会的问题——————————但是实际上呢&#xff0c;有一些小小的坑在里面。 就是三角形的打印。 平常我们在写代码的时候&#xff0c;遇到打印三角形的题&#xff0c;一般简简单单两个for循环搞定 #inclu…