优秀的编程知识分享平台

网站首页 > 技术文章 正文

Python Flask登录和POST请求,云相册项目

nanyue 2024-10-15 11:34:29 技术文章 3 ℃

登录场景

在现在这个社会,我们手机上的很多应用,比如淘宝,京东,微信,QQ等等,都有登录功能的。而且只有登录之后好多功能才能使用,比如购物或者聊天之类的。那登录的过程是怎样的呢?

登录过程分析

首先,我们从一开始说起,我们需要访问到登录页。当我们在浏览器输入网址http://127.0.0.1:8000/user/login的时候,会显示我们的登录页面。

那在登录页面,当我们输入用户名密码点击登录按钮之后,会发生什么呢?当点击登录按钮之后,我们输入的用户名和密码就会传递到服务器,这时我们需要先查询这个用户名到底是不是有效的,也就是说,这个用户有没有注册过,当我们查询了所有已经注册的数据,发现这个用户名根本不存在,那么我们会提示 用户名不存在,那如果我们发现这个用户名是对的,接下来要做的,就是验证输入的密码对不对,验证的方式就是用现在输入的密码,与之前保存在这里的密码对比,如果一样,就是对的,如果不一样,那就是错的了。当密码不正确的时候,我们会给出提示:密码错误,请重试。如果用户名和密码都正确呢?就是登录成功的状态了,就可以直接跳转到主页,继续浏览更多的内容了。

访问登录页

@app.route('/user/login', methods=['GET'])
def login():
    # 返回首页index.html
    return render_template('index.html')

查找用户名

def find(username):
    '''
        根据用户名查找是否已经注册,如果是,返回用户的全部信息,如果不是,返回None
    '''
    for user in users:
        if user['username'] == username:
            return user
    return None

登录核心代码实现

@app.route('/user/login_data', methods=['GET'])
def login2():
    username = request.args.get('username')
    password = request.args.get('password')

    user = find(username)
    if user is None:
        return render_template('index.html', username=username, user_msg='用户名不存在')
    elif user['password'] != password:
        return render_template('index.html', username=username, pass_msg='密码错误,请重试')
    else:
        return "登录成功"

查询路由信息

  • 在程序中获取
  • 在应用中的url_map属性中保存着整个Flask应用的路由映射信息,可以通过读取这个属性获取路由信息
  • print(app.url_map)
  • 如果想在程序中遍历路由信息,可以采用如下方式
  • for rule in app.url_map.iter_rules(): print(rule.endpoint, rule.rule)

以json的方式返回应用内的所有路由信息

@app.route('/')
@app.route('/index')
@app.route('/home')
def home():
    rules_ierator = app.url_map.iter_rules()
    return json.dumps({rule.endpoint: rule.rule for rule in rules_ierator})

POST请求

我们已经知道,在网络传输的过程中,客户端向服务端传递的信息,称为请求。请求有很多种方式,常用的方式有两种,一种是get,一种是post。在上一阶段的学习中,我们已经学过了表单,表单就是用来将数据打包,发送给服务器的工具。不同的请求发送数据有什么样的区别呢?get请求就像公开谈论,传递的信息是公开的,而post则像是传纸条,内容是私密的。

那么post请求具体是什么样子呢?有哪些应用场景呢?

当我们填写了一个表单,并规定了表单以post的方式进行提交,表单中的数据就被打包,通过请求体发送到服务器,而服务器接收到之后,也需要按照post的方式来处理这个请求。

表单一般会有哪些信息呢?用户名……密码……邮箱……等等很多很多信息。

模板设置

<div class="loginBox">
    <!--在下方写你的代码:设置form表单发送post请求方式-->
    <form action="/login" method="post">
        <!--在下方写你的代码:设置input标签的name属性值-->
        <input class="username" type="text" placeholder="账号" name="username">
        <input class="password" type="password" placeholder="密码" name="password">
        <input class="submit" type="submit" value="登 录">
    </form>
</div>

后端发送接收post请求参数

@app.route('/login', methods=['POST'])
def login():

    username = request.form.get('username')
    password = request.form.get('password')

    print(username, password)
    return '<h1>欢迎您,%s</h1>' % username

云相册项目

首先有注册功能,可以访问注册页去注册用户。注册成功后,就可以跳转到登录页,在登录页要完成登录的功能。当登录成功之后呢?就可以显示首页了。

实现流程

接着分析一下首页实现流程,在浏览器输入 127.0.0.1:8000的时候,就会向服务器发送请求,服务器接收到请求之后,会处理请求,请求完成后会返回响应。然后浏览器收到响应信息之后就会把首页显示在页面上了。

# 在下方写你的代码:设置路由,返回首页
@app.route('/')
def home():
    # 把图片数据photos以模板变量的方式传递到前端
    return render_template('index.html', photos=photos)


# 在下方写你的代码:设置路由,返回登录页面
@app.route('/login', methods=['GET'])
def user_login():
    return render_template('login.html')

登录流程

在登录页输入用户名密码,点击登录按钮之后,会向服务器发送请求,服务器接收到输入的用户名和密码之后,会查找用户名,当查到不到的时候,会提示:“用户名不存在”。如果用户名存在,接下来就验证密码是否正确。当密码不正确的时候,提示“密码错误请重试”,如果用户名存在,并且密码也正确的话,就重定向到首页。

设置登录路由,获取用户名密码

在 project.py 中完成定义路由实现登录功能:登录路由为 '/login',请求方式为POST请求,视图函数名称为login,在函数中完成获取用户名和密码,查找用户的功能。给出了提示信息,同学们先独立尝试完成代码。

@app.route('/register', methods=['GET'])
def user_register():
    """
          注册路由,返回注册页面
    """
    return render_template('register.html')


# 在下方写你的代码:设置注册路由,接收post请求,获取注册信息用户名和密码
@app.route('/register', methods=['POST'])
def register():
    username = request.form.get('username')
    password = request.form.get('password')
    user = find(username)
    # 如果用户已存在
    if user is not None:
        return render_template('register.html', msg='该用户已被注册')
    # 构建用户信息,存储到用户列表users中
    user = {'username': username, 'password': password}
    users.append(user)
    return redirect('login')

环境变量加载配置文件

Flask使用环境变量加载配置的本质是通过环境变量值找到配置文件,再读取配置文件的信息,其使用方式为

app.config.from_envvar('环境变量名')

关于silent的说明:

表示系统环境变量中没有设置相应值时是否抛出异常

  • False 表示不安静的处理,没有值时报错通知,默认为False
  • True 表示安静的处理,即时没有值也让Flask正常的运行下去

相关推荐

最近发表
标签列表