flask编写简单用户登录注册页面+腾讯云部署+所遇到一些问题解决

本文演示了一个使用Flask框架实现的简单用户登录注册系统,利用session存储用户信息,并讨论了如何在HTML模板中使用for循环显示数据。此外,还涉及了将应用部署到服务器并使其能在公网访问的方法。
摘要由CSDN通过智能技术生成

代码方面借鉴这篇文章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

        运行后出现的应该会是你的内网地址,这没什么问题,输入公网和端口也能访问,如果不行可以换个浏览器再试试,我就是因为这么件事弄了一天,最后发现公网能访问。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以按照以下步骤在腾讯云服务器上部署 Flask 应用: 1. 购买腾讯云服务器:登录腾讯云官网,选择适合你需求的服务器实例,并购买。 2. 登录服务器:使用 SSH 客户端(如 PuTTY)连接到你的服务器。腾讯云会为你提供登录信息,包括 IP 地址、用户名和密码。 3. 更新服务器:登录成功后,首先更新服务器上的软件包和依赖项,可以运行以下命令: ``` sudo apt update sudo apt upgrade ``` 4. 安装 Python:检查服务器上是否已安装 Python。如果没有,请使用以下命令安装: ``` sudo apt install python3 ``` 5. 创建虚拟环境:在服务器上创建一个虚拟环境来隔离项目的依赖项。可以使用以下命令: ``` python3 -m venv myenv ``` 6. 激活虚拟环境:激活虚拟环境以开始在其中安装和运行应用程序。运行以下命令: ``` source myenv/bin/activate ``` 7. 安装 Flask 和其他依赖项:在虚拟环境中运行以下命令来安装 Flask 和其他需要的依赖项: ``` pip install flask pip install <其他依赖项> ``` 8. 编写 Flask 应用程序:在服务器上创建 Flask 应用程序的主文件,例如 `app.py`,并在其中编写代码。 9. 运行 Flask 应用程序:使用以下命令在服务器上运行 Flask 应用程序: ``` flask run --host=0.0.0.0 ``` 10. 配置防火墙:确保服务器的防火墙允许来自外部的 HTTP 请求访问 Flask 应用程序所使用的端口(默认为 5000)。 11. 测试应用程序:在浏览器中访问服务器的公共 IP 地址,加上 Flask 应用程序的路由路径,检查应用程序是否正常运行。 请注意,这只是一个基本的部署过程示例,实际情况可能会有所不同。你可能还需要配置域名、HTTPS、数据库连接等其他方面的内容,以适应你的具体需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值