由于挂网易云音乐刷歌打卡的服务器因为挂太多了,现在每次执行都需要验证码,所以打算重新建一个,为了避免再次出现验证码的问题,这次我将刷歌服务写在了我的群辉中,动态ip就问你怕不怕,嘿嘿。本来想把之前的源码中加上代理ip的功能的,谁知道作者居然全部加密,goto加密解密就要好几十元,干!没办法,只好上GitHub淘了一个python版的,自己写一个网站。
之所以有这篇文章就是上面的原因了,Python建站我也是第一次,学习了好几个小时终于写出了我想要的功能,不容易啊!
首先安装Flask库,pip工具很方便。
pip install Flask
然后引入Flask库以及里面用得上的类
request:网络请求类
render_template:加载模板
redirect:重定向
url_for:查找url
session:一种cookie验证
g:全局变量
首先启动Flask服务
app=Flask(__name__,static_url_path="/")
服务名称是当前python文件名, static_url_path 指定了此网站的静态文件存放地址
设置session秘钥,不设置无法使用
app.config["SECRET_KEY"]="DAIMADOG"
使用dataclass创建一个临时的用户数据表,真实项目中一般读取mysql等数据库中的数据。
@dataclass class User: user_id:int username:str password:str users=[ User(1,"daimadog","123456"), User(2,"test","123456"), User(3,"admin","123456") ]
在每次请求前对用户身份进行认证
@app.before_request def before_request(): g.user=None if "user_id" in session: user=[u for u in users if u.user_id==session["user_id"]][0] g.user=user
这里每次请求都将全局变量g.user清空,并判断session里面是否有user_id的键名,有就取出对应的键值去user表中查用户,如果有用户,就将该用户赋值给全局g.user。
@app.route("/login",methods=["get","post"])
def login():
if request.method=="POST":
session.pop("user_id",None)
username=request.form.get("username",None)
password=request.form.get("password",None)
user=[u for u in users if u.username==username]
if user["password"]==password:
session["user_id"]=user["user_id"]
return redirect(url_for("member"))
else:
g.allmsg="用户名或密码错误"
return render_template("login.html")
elif request.method=="GET":
if "user_id" in session:
return redirect(url_for("member"))
else:
return render_template("login.html")使用route方法定义路由,当用户访问地址/login时,执行login()方法里面的逻辑,根据不同的请求及验证结果跳转到不同的网页模板。这里是简单的用户验证,就不多解释了。
网页模板存放在python主程序所在目录下的 templates 文件夹中
@app.route('/logout')
def logout():
session.pop('user_id', None)
return redirect(url_for('login'))同理上面的是用户登出,下面的是用户中心。
@app.route("/member")
def member():
if not g.user:
return redirect(url_for("login"))
return render_template("member.html")最后启动flask服务(ipv4)。port是端口号自己定义。
app.run(port=9001,debug=True,host='0:0:0:0')
注意:ipv6地址开放服务请将host换成 ‘::’ 即可。
下面是完整代码
from flask import Flask
from flask import request,render_template,redirect,url_for,session,g
from dataclasses import dataclass
app=Flask(__name__,static_url_path="/")
app.config["SECRET_KEY"]="DAIMADOG"
@dataclass
class User:
user_id:int
username:str
password:str
users=[
User(1,"daimadog","123456"),
User(2,"test","123456"),
User(3,"admin","123456")
]
@app.before_request
def before_request():
g.user=None
if "user_id" in session:
user=[u for u in users if u.user_id==session["user_id"]][0]
g.user=user
@app.route("/login",methods=["get","post"])
def login():
if request.method=="POST":
session.pop("user_id",None)
username=request.form.get("username",None)
password=request.form.get("password",None)
user=[u for u in users if u.username==username][0]
if user.password==password:
session["user_id"]=user.user_id
return redirect(url_for("member"))
else:
g.allmsg="用户名或密码错误"
return render_template("login.html")
elif request.method=="GET":
if "user_id" in session:
return redirect(url_for("member"))
else:
return render_template("login.html")
@app.route('/logout')
def logout():
session.pop('user_id', None)
return redirect(url_for('login'))
@app.route("/member")
def member():
if not g.user:
return redirect(url_for("login"))
return render_template("member.html")
app.run(port=9001,debug=True,host='::')登录表单 login.html
{% if not g.allmsg==None %}
<h3>{{g.allmsg}}</h3>
{% endif %}
<div class="formdiv">
<section class="sign-container">
<form class="sign-form" action="" method="post" name="">
<div class="item">
<label>用户名</label>
<input type="text" name="username" class="ipt" placeholder="输入登录账号">
</div>
<div class="item">
<label>
密码</label>
<input type="password" name="password" class="ipt" id="inputPassword" placeholder="输入密码">
</div>
<div class="sign-submit">
<input type="submit" id="tj" class="btn btn-primary btn-block" value="登录">
</div>
</form>
</section>
</div>用户中心member.html
<html>
<head></head>
<body>
<h1>欢迎:{{g.user.username}}</h1>
<p>编号:{{g.user.user_id}}</p>
<p>密码:{{g.user.password}}</p>
</body>
</html>






评论 (0)