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