让代码更简单

使用Python的Flask库建站

重要:本文最后更新于2021-09-06 14:23:19,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

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

使用Python的Flask库建站

 

感觉很棒!可以赞赏支持我哟~

0 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐