由于挂网易云音乐刷歌打卡的服务器因为挂太多了,现在每次执行都需要验证码,所以打算重新建一个,为了避免再次出现验证码的问题,这次我将刷歌服务写在了我的群辉中,动态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)