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_DICTreturn 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']=nameDATA_DICT[nid]['age']=agereturn 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.rhkb.cn/news/296733.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP的十个重要的机制

注&#xff1a;TCP不是只有十个机制 TCP 可靠传输是tcp最为重要的核心&#xff08;初心&#xff09; 可靠传输&#xff0c;并不是发送方把数据能够100%的传输给接收方 而是退而求其次 让发送方发送出去数据之后&#xff0c;能够知道接收方是否收到数据。 一但发现对方没有…

Head First Design Patterns -代理模式

什么是代理模式 代理模式为另一个对象提供替身或者占位符&#xff0c;以便控制客户对对象的访问&#xff0c;管理访问的方式有很多种。例如远程代理、虚拟代理、保护代理等。 远程代理&#xff1a;管理客户和远程对象之间的交互。 虚拟代理&#xff1a;控制访问实例化开销大的对…

upload-labs训练平台

GitHub&#xff1a;GitHub - Tj1ngwe1/upload-labs: 一个帮你总结所有类型的上传漏洞的靶场 把下好的文件夹之间拖入到小皮的WWW目录下就可以之间访问网址使用了 目录 Pass-01(前端JS的绕过) (1)抓包绕过 (2)在前端绕过 Pass-02&#xff08;content-type绕过&#xff09;…

LabVIEW专栏五、网口

该节目标编写一个网口调试VI。 上一章是串口&#xff0c;这章介绍网口的写法。 一、网口硬件 1.1、上位机网口 1.2、网口线 由线缆和水晶头组成&#xff0c;现在一般用5类和超5类的网线 1.3、接线方式 忽略&#xff0c;这里加上这点为了提醒一个硬件和上位机连接&#xf…

【并发编程】CountDownLatch

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳中求进&#xff0c;晒太阳 CountDownLatch 概念 CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。 CountDownLatch 定义了一个计数器&#xff0c;…

【多线程】震惊~这是我见过最详细的ReentrantLock的讲解

一.与synchronized相比ReentrantLock具有以下四个特点: 可中断&#xff1a;synchronized只能等待同步代码块执行结束&#xff0c;不可以中断&#xff0c;强行终断会抛出异常, 而reentrantlock可以调用线程的interrupt方法来中断等待&#xff0c;继续执行下面的代码。 在获取锁…

【C++学习】哈希表的底层实现及其在unordered_set与unordered_map中的封装

文章目录 1. unordered系列关联式容器1.1 unordered_map1.2 unordered_set1.3.底层结构 2.哈希2.1哈希概念2.2哈希冲突2.3 哈希函数2.4 哈希冲突解决2.4.1闭散列2.4.1开散列2.5开散列与闭散列比较 3.哈希的模拟实现1. 模板参数列表2. 迭代器的实现3. 增加通过key获取value操作4…

基于 Quartz.NET 可视化任务调度平台 QuartzUI

一、简介 QuartzUI 是基于 Quartz.NET3.0 的定时任务 Web 可视化管理&#xff0c;Docker 打包开箱即用、内置 SQLite 持久化、语言无关、业务代码零污染、支持 RESTful 风格接口、傻瓜式配置、异常请求邮件通知等。 二、部署 QuartzUI 从 2022 年到现在没有提交记录&#xf…

YOLO火灾烟雾检测数据集:20000多张,yolo标注完整

YOLO火灾烟雾检测数据集&#xff1a;一共20859张图像&#xff0c;yolo标注完整&#xff0c;部分图像应用增强 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 需要此数据集或其他任何数据集请私信

zabbix源码安装

目录 一.安装php和nginx客户端环境 二.修改php配置 三.修改nginx配置文件 四.下载并编译zabbix 五.创建zabbix需要的用户及组 六.安装编译需要的依赖 七.配置zabbix文件 八.数据库配置 九.配置zabbix 十.web界面部署 十一.遇到无法创建配置文件 十二.登录zabbix 前…

基于深度学习的条形码二维码检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的条形码二维码检测系统。核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streamlit的交互…

.Websalm勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言&#xff1a; 在数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒作为一种新型的电脑病毒&#xff0c;以其独特的传播方式和恶劣的性质&#xff0c;给广大用户带来了巨大的困扰。近期&#xff0c;Websalm勒索病毒成为了公众关注的焦点&#xff0c;其强…

刷题DAY44 | 完全背包问题 LeetCode 518-零钱兑换 II 377-组合总和 Ⅳ

完全背包问题模版 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题…

【Oracle篇】expdp/impdp高效完成全部生产用户的全库迁移(第四篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣️❣️…

C++中的vector与C语言中的数组的区别

C中的vector和C语言中的数组在很多方面都有所不同&#xff0c;以下是它们之间的一些主要区别&#xff1a; 大小可变性&#xff1a; vector是C标准模板库&#xff08;STL&#xff09;提供的动态数组容器&#xff0c;它的大小可以动态增长或减少。这意味着你可以在运行时添加或删…

物联网实战--入门篇之(七)嵌入式-MQTT

目录 一、MQTT简介 二、MQTT使用方法 三、MQTT驱动设计 四、代码解析 五、使用过程 六、总结 一、MQTT简介 MQTT因为其轻量、高效和稳定的特点&#xff0c;特别适合作为物联网系统的数据传输协议&#xff0c;已经成为物联网事实上的通信标准了。关于协议的具体内容看看这…

校园局域网钓鱼实例

Hello &#xff01; 我是"我是小恒不会java" 本文仅作为针对普通同学眼中的网络安全&#xff0c;设计的钓鱼案例也是怎么简陋怎么来 注&#xff1a;本文不会外传代码&#xff0c;后端已停止使用&#xff0c;仅作为学习使用 基本原理 内网主机扫描DNS劫持前端模拟后端…

图论基础(python蓝桥杯)

图的基本概念 图的种类 怎么存放图呢&#xff1f; 优化 DFS 不是最快/最好的路&#xff0c;但是能找到一条连通的道路。&#xff08;判断两点之间是不是连通的&#xff09; 蓝桥3891 import os import sys sys.setrecursionlimit(100000) # 请在此输入您的代码 n, m map(int,…

【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

SQL server 查询数据库中所有的表名及行数

SQL server 查询数据库中所有的表名及行数 select a.name,b.rows from sysobjects as ainner join sysindexes as bon a.id b.id where (a.type u)and (b.indid in (0, 1)) and b.rows<50 and b.rows>20 order by a.name, b.rows desc;