from flask import Flask,render_template,request,redirect,session,url_for app = Flask(__name__) USER = { 1:{'name':'wdc','age':18,'text':'我的名字叫做王德昌'}, 2:{'name':'wdw','age':16,'text':'我的名字叫做王德武'}, 3:{'name':'pjj','age':19,'text':'我的名字叫做潘军军'} } #用来查看是否有用户登录,用session这个全局变量来保存 session = {} @app.route('/',methods = ['GET','POST']) #每一次将主页设置为‘/’,要修改请求方式,因为在/login的url中要输入东西 @app.route('/login',methods = ['GET','POST'],endpoint='l1') #endpoint是一个反向输出 def login(): if request.method == 'GET': return render_template('login.html') else: user = request.form.get('user') pwd = request.form.get('pwd') if user == 'wdc' and pwd == '123': #登录成功后用session来保存这个用户信息 session['user_info'] = user return redirect('http://www.baidu.com') return render_template('login.html',error = "用户名或密码错误") @app.route('/index',methods=['GET']) def index(): url_1 = url_for('l1') user = session.get('user_info') if user: return render_template('index.html',user_dict = USER) return redirect(url_1) @app.route('/detail/<int:nid>',methods = ['GET']) def detail(nid): url_1 = url_for('l1') user = session.get('user_info') if user: info = USER.get(nid) return render_template('detail.html',info = info) return redirect(url_1) app.run(debug=True)
根据代码来分析以及整理下思路:
这是一个很简单的flask的简单web应用
那么现在就来分析下我对这个简单应用的理解以及思路
知识点:
/login中的知识点
1.首先从创建/login这个url开始,从这个url中我们可以看到俩种常见的请求方法methods = ['GET','POST']
当用户没有在网页中提交数据的时候,网页默认使用的是GET的请求方法,当网页有提交的数据的时候,我们要改用POST方法
2.利用常见的render_template() 和 redirect() 以及request
render_templat的作用是返回一个html页面,并且在后面的参数是给html中的页面提供参数
redirect的作用是用来跳转网页
request可以让用户找到请求的信息,比如本例中的request.methods 可以获取到页面中的请求方法
/index中的知识点
1.在本例中/index是用来返回用户数据的信息,所以直接使用render_template来返回指定的html页面,使用USER给html中的页面获取哦参数,从而使在html中可以获取到用户的信息
在index.html其实才是这个url的重点所在
<body> <h1>用户列表</h1> <table> {%for k,v in user_dict.items()%} <tr> <td>{{k}}</td> <td>{{v['name']}}</td> <td><a href="/detail/{{k}}">查看详细</a></td> </tr> {% endfor %} </table> </body> </html>
2.使用字典的取键值的方法来获取USER中的信息,并且设置新的url跳转到详细信息中
/detail/<int>中的重点是:
info = USER.get(nid) return render_template('detail.html',info = info)
获取url中的信息,并且通过这个信息获取USER中的信息
<body> <h1>详细信息</h1> <div>{{info['text']}}</div> </body>
获取USER中的详细信息。
然后从全局代码出发,可以看到session的作用是用来临时存储用户的
如果没有成功的存取,或者是存取失败的那么都将会跳回到/login进行用户认证,认证成功后才可以进入别的url访问资源
小的知识点:
endpoint:指代url的别名
url_for:将指代的别名赋给一个新的变量,那么这个变量就代表了别名前指代的url
index.html的源码
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>用户登录</h1> <form method="post"> <input type="text" name="user"> <input type="text" name="pwd"> <input type="submit" value="登录" >{{error}} </form> </body> </html>
login.html的源码
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>用户列表</h1> <table> {%for k,v in user_dict.items()%} <tr> <td>{{k}}</td> <td>{{v['name']}}</td> <td><a href="/detail/{{k}}">查看详细</a></td> </tr> {% endfor %} </table> </body> </html>
detail.html的源码
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>详细信息</h1> <div>{{info['text']}}</div> </body> </html>