flask的使用学习笔记1

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

flask是一个轻量级,短小精悍,django大而全

创建: 

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.mzph.cn/news/784131.shtml

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

相关文章

【吴恩达机器学习笔记】神经网络初探

前言 传统机器学习不足 【例】预测房价&#xff0c;不同的房子有上百个特征 如果要包含所有的二次项&#xff08;即使只是二次&#xff09;&#xff0c;最终也有很多项&#xff0c; 每个参数都有 n 个变量&#xff0c;那二次项数量将会是 n^2 /2 级别的量级&#xff0c;模型…

并查集

本文用于个人算法竞赛学习&#xff0c;仅供参考 目录 一.什么是并查集 二.并查集实现 三.路径优化 四.时间复杂度 五.并查集路径压缩 模板 五.题目 一.什么是并查集 并查集&#xff08;Disjoint Set&#xff09;是一种数据结构&#xff0c;用于处理一系列不相交的集合的合…

一文了解JAVA的常用API

目录 常用kpimathSystemRuntimeObjectObjectsBigIntegerBigDecima正则表达式包装类 常用kpi 学习目的&#xff1a; 了解类名和类的作用养成查阅api文档的习惯 math 工具类。因为是工具类&#xff0c;因此直接通过类名.方法名(形参)即可直接调用 abs&#xff1a;获取参数绝对…

Linux学习:进程(4)程序地址空间(笔记)

目录 1. Linux下各种资源的内存分布2. 物理地址与虚拟(线性)地址3. 程序地址空间的区域划分4. 地址映射与页表5. 缺页中断 1. Linux下各种资源的内存分布 2. 物理地址与虚拟(线性)地址 在有关进程创建的初步学习中&#xff0c;我们了解了fork函数创建子进程的方式。此种进程的创…

Spring Boot 一.基础和项目搭建(上)

之前也自学过SSM框架&#xff0c;Spring Boot框架&#xff0c;也动手写过几个项目&#xff0c;但是这是第一次完整的记录。从0开始&#xff0c;把一些细节整理了一下。 大概会分为十几小节&#xff0c;这是一个学习的过程&#xff0c;更是一个思考的过程&#xff0c;废话不多说…

金融汽车科技LLM

汇丰银行 众安保险 1. AIGC重塑保险价值链 小额高频 2.构建智能应用的技术方案演进 增加微服务 长记忆&#xff1a;向量库短记忆&#xff1a;对话历史&#xff0c;思考路径&#xff0c;执行历史 中台架构设计 蔚来汽车在大模型的应用实践 公司介绍 应用架构 应用实践 4.大…

Django框架之DRF(武沛齐全)

一、FBV和CBV FBV&#xff0c;function base views&#xff0c;其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import views urlpatterns [path(users/, views.users), ] from django.http import JsonResp…

快速排序---算法

1、算法概念 快速排序&#xff1a;通过一趟排序将待排记录分隔成独立的两部分&#xff0c;其中一部分记录的数据均比另一部分的数据小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到震哥哥序列有序。 快速排序的最坏运行情况是O()&#xff0c;比如说顺序数…

网络基础二补充——json与http协议

五、市面上常用序列化和反序列化工具 ​ 常用的有&#xff1a;json、protobuf、xml三种方案&#xff1b; 5.1json的使用 1.安装jsoncpp库&#xff0c;是一个第三方的开发库文件&#xff1b; sudo yum install -y jsoncpp-devel2.使用json ​ 经常使用的头文件是json.h&…

【uC/OS-III篇】uC/OS-III 创建第一个任务(For STM32)

uC/OS-III 创建第一个任务&#xff08;For STM32&#xff09; 日期&#xff1a;2024-3-30 23:55&#xff0c;结尾总结了今天学习的一些小收获 本博客对应的项目源码工程 源码项目工程 1. 首先定义错误码变量 // 用于使用uC/OS函数时返回错误码 OS_ERR err; 2. 定义任务控制…

Golang | Leetcode Golang题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; func addTwoNumbers(l1, l2 *ListNode) (head *ListNode) {var tail *ListNodecarry : 0for l1 ! nil || l2 ! nil {n1, n2 : 0, 0if l1 ! nil {n1 l1.Vall1 l1.Next}if l2 ! nil {n2 l2.Vall2 l2.Next}sum : n1 n2 carrysum, carry …

Vue ElementPlus Input输入框

Input 输入框 通过鼠标或键盘输入字符 input 为受控组件&#xff0c;它总会显示 Vue 绑定值。 通常情况下&#xff0c;应当处理 input 事件&#xff0c;并更新组件的绑定值&#xff08;或使用v-model&#xff09;。否则&#xff0c;输入框内显示的值将不会改变。不支持 v-mode…

【面试经典150 | 动态规划】最小路径和

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;动态规划方法二&#xff1a;空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题…

MCGS学习——水位控制

要求 插入一个水罐&#xff0c;液位最大值为37插入一个滑动输入器&#xff0c;用来调节水罐水位&#xff0c;滑动输入器最大调节为液位最大值&#xff0c;并能清楚的显示出液位情况用仪表显示水位变化情况&#xff0c;仪表最大显示设置直观清楚方便读数&#xff0c;主划线为小…

设计模式-结构型-享元模式Flyweight

享元模式的特点&#xff1a; 享元模式可以共享相同的对象&#xff0c;避免创建过多的对象实例&#xff0c;从而节省内存资源 使用场景&#xff1a; 常用于需要创建大量相似的对象的情况 享元接口类 public interface Flyweight { void operate(String extrinsicState); } 享…

如何使用极狐GitLab 自定义 Pages 根域名

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了极狐GitLab Pages …

普发Pfeiffer 真空TCP120-TCP380-TCP035-TCP600 使用手侧

普发Pfeiffer 真空TCP120-TCP380-TCP035-TCP600 使用手侧

C++进阶:多态(笔记)

目录 1. 多态相关概念1.1 简述&#xff1a;多态1.2 概念汇总与补充 2. 多态重写的底层原理2.1 虚函数存储的结构与位置2.2 重写覆盖 1. 多态相关概念 1.1 简述&#xff1a;多态 1. 什么是多态 不同的对象去做同一个行为时&#xff0c;得到的结果不同。反应到编程语言中&#…

Go语言HTTP服务实现GET和POST请求的同时支持

引言 在现代的Web开发中&#xff0c;HTTP服务是构建网络应用程序的基础。而支持GET和POST请求是其中最基本、最常见的功能之一。GET请求用于从服务器获取数据&#xff0c;而POST请求则用于向服务器提交数据。在Go语言中&#xff0c;通过标准库中的net/http包&#xff0c;我们可…

实景三维技术:开启自然资源管理的新篇章

随着科技的不断进步&#xff0c;实景三维技术已经在多个领域得到了广泛的应用。而在自然资源管理领域&#xff0c;实景三维技术更是发挥着越来越重要的作用。本文将介绍实景三维在自然资源管理领域的应用&#xff0c;探讨其带来的优势和变革。一、什么是实景三维技术&#xff1…