跟着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遇到的此状况的解决办法-****博客
因为user获取失败(或者==None)会重定向无限循环导致的,每次重定向又会发送一个请求,满足重定向的条件循环
是因为login函数,不需要装饰器@auth