代码方面借鉴这篇文章https://blog.csdn.net/Wangtuo1115/article/details/104699716
因为是借鉴别人的代码,所以就不细讲代码,主要讲述一下我在期间遇到的问题。
啥也不说了,直接放代码
from flask import Flask, request, render_template, redirect, session, flash, render_template_string
app = Flask(__name__)
# flash的消息都存储在session,需要一个会话密匙,密匙随便输入就行,如果对保密性要求高的话,可以使用相关的密匙生成函数
app.config['SECRET_KEY'] = 'winglet'
#users用来储存用户登录信息
users = [
{
'id' : 0,
'username': 'admin',
'password': '123456'
}
]
@app.route('/', methods=['GET', 'POST'])
def index():
page = '''
<h3> welcome winglet's web </h3>
<p>有账号请点击<a href="/login"> 登录 </a></p>
<p>无账号请点击<a href="/register"> 注册 </a></p>
'''
return render_template_string(page)
@app.route('/login', methods=['GET', 'POST'])
def login():
#设置两种请求方式后的响应,GET方式就是用来填入登录信息并准备传输,POST就是判断传输的登录信息符不符合标准
if request.method == 'GET':
page='''
<h3 align='center'>登录<h3>
<form action="/login" method="post">
<!-- required="":用户名不能为空 -->
<input class="text" type="text" name="username" placeholder="用户名" required="">
<input class="text" type="password" name="password" placeholder="密码" required="">
<div class="wthree-text">
<ul>
<li>
<label class="anim">
<input type="checkbox" class="checkbox" >
<span> 记住 ?</span>
</label>
</li>
</ul>
<div class="clear"> </div>
</div>
<input type="submit" value="登录">
{% for msg in get_flashed_messages() %}
<p style="color: red;">{{ msg }}</p>
{% endfor %}
</form>
<p>无账号,请点击<a href="/register">注册</a> </p>
'''
#闪现消息的创建和接收: 在主程序中flash(message)—>在html文档中{{ get_flashed_message }}接收闪现消息。flash的消息都存储在session,需要一个会话密匙,密匙随便输入就行。
return render_template_string(page)
else:
username = request.form.get('username')
password = request.form.get('password')
for user in users:
if user['username'] == username and user['password'] == password:
session['username'] = username #session[] 添加 就像是python的字典 用这种方式把登录中的信息储存起来后面会利用上
session['id'] = user['id']
session['password'] = password
return redirect(f"/user/{user['id']}")
flash("账号或密码输入错误,请重新输入")
return redirect("/login")
@app.route('/register', methods=['GET', 'POST'])
def register():
id = 0
if request.method == 'GET':
page = '''
<h3 align='center'>注册<h3>
<form action="/register" method="post">
<input class="text" type="text" name="username" placeholder="用户名" required="">
<input class="text" type="password" name="password" placeholder="密码" required="">
<div class="wthree-text">
<ul>
{# <li>#}
{# <label class="anim">#}
{# <input type="checkbox" class="checkbox" required="">#}
{# <span> 记住 ?</span> #}
{# </label> #}
{# </li>#}
<li><a href="#">忘记密码 ?</a></li>
</ul>
<div class="clear"></div>
</div>
<input type="submit" value="注册">
{% for msg in get_flashed_messages() %}
<P style="color: red">{{ msg }}</P>
{% endfor %}
<p>已有账号? <a href="/login/"> 立即登录!</a></p>
</form>
'''
return render_template_string(page)
else:
username = request.form.get('username')
password = request.form.get('password')
print(username + '\n' + password)
for user in users:
id += 1
if user['username'] == username:
flash('已有该用户,请重新注册')
return redirect('/register')
users.append(dict(id=id,username=username, password=password))
print(users)
flash('用户注册成功,请登录')
return redirect('/login')
@app.route('/user/<int:id>', methods=["GET", "POST"])
def user(id):
#判断用户 我想的是只有管理员才有权限查看全部登录信息 一般用户只能看自己的
if id == 0:
page = '''
<span style="font-weight: bold;">welcome {{ session.get('username') }}</span>
<form action="/list/{{session.get('id')}}" method='post'>
<input type='submit' value='查看全部信息'>
</form>
<p><a href="/out">退出登录</a>
'''
return render_template_string(page)
else :
page = '''
<span style="font-weight: bold;">welcome {{ session.get('username') }}</span>
<form action="/list/{{session.get('id')}}" method='post'>
<input type='submit' value='查看个人信息'>
</form>
<p><a href="/quit">退出登录</a> <a href=/logout>注销</a></p>
'''
return render_template_string(page)
@app.route('/list/<int:id>', methods=['GET', 'POST'])
def list(id):
if id == 0 and session.get('username') == 'admin' and session.get('password') == '123456':
page = '''
{% block body %}
<h3 align='center'>
全部用户信息
</h3>
<table width="80%" align="center" style="margin-top: 50px">
<tr>
<td> id</td>
<td>用户名</td>
<td>密码</td>
</tr>
{% for user in users %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.username }}</td>
<td>{{ user.password }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
'''
print(session.get('username'))
return render_template_string(page, users=users)
elif isinstance(session.get('username'),str):
page = '''
<h3 align='center'>
本人信息
</h3>
<table width="80%" align="center" style="margin-top: 50px">
<tr>
<td>id</td>
<td>用户名</td>
<td>密码</td>
</tr>
<tr>
<td>{{ session.get('id') }}</td>
<td>{{ session.get('username') }}</td>
<td>{{ session.get('password') }}</td>
</tr>
</table>
'''
return render_template_string(page)
else:
return '你未登录无法查看用户信息'
@app.route('/logout')
def logout():
#注销那就要把users中这个人的登录信息全部删除 并且要清理session储存的信息
id = 0
users.pop(session.get('id'))
for user in users:
user['id'] = id
id += 1
session.clear()
page = '''
<p>注销成功,点击<a href='/'>返回</a></p>
'''
return render_template_string(page)
@app.route('/quit')
def out():
session.clear()
return redirect('/')
if __name__ == "__main__":
#host设为0.0.0.0为的是之后能在上传服务器后能公网访问
app.run(host='0.0.0.0', port=5000)
问题1:如何注册后储存用户登录信息
就如在一开时设的users,这个就是用来储存信息的变量,不过记得看仔细这个变量是一个列表,而它里面存的是字典。
问题2:如何登录成功后,在别的页面用的依然是该登录信息
简单来说就是,我令只有以admin为用户名登录的人才能看到所有用户的信息,那么别的用户就不能让他们看到其他用户信息,这时我们就要判断此时正在登陆状态的用户,而我每个网页数据都是单独的,它们能用users也只是因为它写在外面属于全局变量,所以都能使用。
不过基于此我想到能不能让登录信息储存在某个都能调用的地方,这时就要利用session,虽然现在我对它的概念还有点模糊,不过用它来储存并使用这一想法是可行的。
所以我们用session[]来添加要储存的信息,用session.get()来调用
问题3:如何在html中写入循环打印数据
假如注册的用户有许多人,那我们以admin去查看全部用户信息时就会看到他们的信息,虽然我们可以直接打印users不过这样的画网页呈现出来的效果就会不太美观,虽然我这代码呈现的很简陋,但还是要稍微工整一点的嘛。
想一想我们在python等代码中要打印一系列数据,是要用到for循环的,所以我们也可以利用,这时要提到因为我们是用模板渲染而呈现网页的,而它有一个特点{{}}里面的东西会作为代码执行,所以
{% for user in users%}
{{user.username}}
{%endfor%}
这样就能依次打印users里的username了,对了users必须在跳转到这个网页时传给它,否则就无法识别。
问题4:flask部署到服务器,并能在公网上访问
首先就是host改为0.0.0.0,port的端口号你的服务器得是开着的,我用的是nginx部署网站。
之后用xshell在flask文件所在位置输入(运行文件)
python3 [文件名]
注意:得先在服务器上安装flask,输入
pip3 install flask
运行后出现的应该会是你的内网地址,这没什么问题,输入公网和端口也能访问,如果不行可以换个浏览器再试试,我就是因为这么件事弄了一天,最后发现公网能访问。