使用Python-Flask框架开发Web网站系列课程(三)登录功能

news/2024/5/9 20:00:18/文章来源:https://blog.csdn.net/weixin_34417183/article/details/89659130
版权声明:如需转载,请注明转载地址。 https://blog.csdn.net/oJohnny123/article/details/81975386

前言


使用IDE:PyCharm

操作系统:Mac

Python的版本:3.6

我的邮箱:51263921@qq.com

交流群:372430835

说明:

本次课程的GitHub代码在最下面。

本次课程基于上个课程的代码,如果没看过的请先传送:

使用Python的瓶框架开发的Web网站系列课程(一)构建项目

使用Python的瓶框架开发的Web网站系列课程(二)注册功能

 

一、登录


本次课程主要实现登录,我们按照实际开发的流程,先看到登录页面,再尝试页面传值(也就是输入账号密码)到服务端,服务端校验和鉴权,并跳转页面。

1.1增加backend.account.views关于登录的代码

全路径:/myproject/backend/account/views.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
Created by liaoyangyang1 on 2018/8/22 上午9:40.
"""
from flask import Blueprint,request,render_template,jsonify,flash  #第二课增加内容
from backend.models.UserModel import User
from backend.models import db#账户的蓝图  访问http://host:port/account 这个链接的子链接,都会跳到这里
account = Blueprint('/account', __name__)  #第二课增加内容# 访问http://host:port/account/register 这个链接,就会跳到这里
@account.route('/register',methods=(["GET","POST"]))  #第二课增加内容
#上面的链接,绑定的就是这个方法,我们给浏览器或者接口请求 一个json格式的返回
def register():  #第二课增加内容if request.method == 'POST':form = request.formuser = User(username=form['username'],email=form['email'],password=form['password'])db.session.add(user)db.session.commit()return jsonify(form)return render_template('/account/register.html')@account.route('/login',methods=(["GET","POST"]))
def login(): #第三课内容if request.method == "POST":return  jsonify(request.form)return render_template('/account/login.html')

1.2增加html页面文件

全路径:/myproject/frontend/account/login.html

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>INSPINIA | Login</title><link href="https://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.css" rel="stylesheet"><link href="https://cdn.bootcss.com/font-awesome/4.3.0/css/font-awesome.css" rel="stylesheet"><link href="https://cdn.bootcss.com/animate.css/3.5.2/animate.css" rel="stylesheet"><link href="../static/css/style.css" rel="stylesheet"></head><body class="gray-bg"><div class="middle-box text-center loginscreen animated fadeInDown"><div><div><h1 class="logo-name">IN+</h1></div><h3>Welcome to IN+</h3><p>Perfectly designed and precisely prepared admin theme with over 50 pages with extra new web app views.<!--Continually expanded and constantly improved Inspinia Admin Them (IN+)--></p><p>Login in. To see it in action.</p><form class="m-t" role="form" action="/account/login" method="post"><div class="form-group"><input type="text" class="form-control" name="username" placeholder="Username" required=""></div><div class="form-group"><input type="password" class="form-control" name="password" placeholder="Password" required=""></div>{% with messages = get_flashed_messages() %}{% if messages %}<div class="alert alert-success">{% for message in messages %}{{ message }}{% endfor %}</div>{% endif %}{% endwith %}<button type="submit" class="btn btn-primary block full-width m-b">Login</button><a href="#"><small>Forgot password?</small></a><p class="text-muted text-center"><small>Do not have an account?</small></p><a class="btn btn-sm btn-white btn-block" href="register.html">Create an account</a></form><p class="m-t"> <small>Inspinia we app framework base on Bootstrap 3 &copy; 2014</small> </p></div></div><!-- Mainly scripts --><script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.js"></script><script src="https://cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.js"></script></body>
</html>

1.3 测试一把

点击login后显示如下的话,表示成功。{"password": "abc123", "username": "admin"
}

1.4 修改backend.account.view 增加鉴权代码

1.4.1 装个包    pip install Flask-Login==0.4.1

1.4.2 修改 /myproject/backend/view.py  注意修改文件的路径

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
Created by liaoyangyang1 on 2018/8/21 下午3:51.
"""
from flask_login import LoginManager  #第三课新增# Set up Flask-Login
login_manager = LoginManager()  #第三课新增
login_manager.session_protection = 'strong'  #第三课新增
login_manager.login_view = 'account.login'  #第三课新增

1.4.3 修改/myproject/backend/__init__.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
Created by liaoyangyang1 on 2018/8/21 下午2:41.
"""
import os
from flask import Flask
from config.config import config
from backend.urls import register
from backend.models import db  #第二课增加内容
from backend.views import login_manager #第三课增加内容BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
BASE_TEMPLATE_FOLDER = os.path.join(BASE_DIR,'frontend')def create_app():#初始化项目实例app = Flask(__name__,template_folder=BASE_TEMPLATE_FOLDER,static_folder=os.path.join(BASE_DIR,'frontend','static'))app.secret_key = app.config['SECRET_KEY']#导入配置项app.config.from_object(config)# 注册路由register(app)# 注册数据库db.init_app(app) #第二课增加内容#注册登录组件login_manager.init_app(app)  #第三课增加内容# 钩子 在请求执行之前@app.before_requestdef before_request():print('hi')return app

1.4.4 修改/myproject/backend/account/views.py

这里和之前的区别是增加了鉴权的内容,判断用户名和密码是否为空,判断密码对不对。增加了登出的功能。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
Created by liaoyangyang1 on 2018/8/22 上午9:40.
"""
from flask import Blueprint,request,render_template,jsonify,flash  #第二课增加内容
from flask import redirect,url_for,current_app
from backend.models.UserModel import User
from backend.models import db
from flask_login import login_user,login_required,logout_user #第三课增加内容#账户的蓝图  访问http://host:port/account 这个链接的子链接,都会跳到这里
account = Blueprint('account', __name__)  #第二课增加内容# 访问http://host:port/account/register 这个链接,就会跳到这里
@account.route('/register',methods=(["GET","POST"]))  #第二课增加内容
#上面的链接,绑定的就是这个方法,我们给浏览器或者接口请求 一个json格式的返回
def register():  #第二课增加内容if request.method == 'POST':form = request.form user = User(username=form['username'],email=form['email'],password=form['password'])  db.session.add(user)db.session.commit()return jsonify(form)return render_template('/account/register.html')@account.route('/login',methods=(["GET","POST"]))
def login(): #第三课内容if request.method == "POST":form = request.form #获取登录表单user = User.query.filter_by(username=form['username']).first()  #查出用户信息if user is not None and user.password_hash is not None and user.verify_password(form['password']):  #检查密码是否正确login_user(user,True)  #登录操作flash('You are now logged in. Welcome back!', 'success')return redirect( url_for(request.args.get('next') or 'admin.index'))else:flash('Invalid email or password.', 'error')return render_template('/account/login.html')@account.route('/logout')
@login_required
def logout():logout_user()flash('You have been logged out.', 'info')return redirect(url_for('admin.index'))

1.4.5 调整一下我们的/myproject/backend/models/UserModel.py

 增加了鉴权模块需要的东西,知识点可以百度flask_login的user_loader和anonymous_user

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
Created by liaoyangyang1 on 2018/8/22 下午1:50.
"""
from flask_login import UserMixin,AnonymousUserMixin  #第二课增加内容
from werkzeug.security import check_password_hash, generate_password_hash  #第二课增加内容
from backend.models import db  #第二课增加内容
from backend.views import login_manager #第三课新增class User(UserMixin, db.Model):  #第二课增加内容__tablename__ = 'users'  #这是我们将来建出来的表的表名,在这里定义,下面的都是字段名和字段类型长度这些id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(64), index=True)email = db.Column(db.String(64), unique=True, index=True)password_hash = db.Column(db.String(128))#脱敏@propertydef password(self):  #第二课增加内容raise AttributeError('`password` is not a readable attribute')#加密@password.setterdef password(self, password):  #第二课增加内容self.password_hash = generate_password_hash(password)#校验密码def verify_password(self, password):  #第二课增加内容return check_password_hash(self.password_hash, password)#查询返回的格式def __repr__(self):  #第二课增加内容return '<User \'%s\'>' % self.usernameclass AnonymousUser(AnonymousUserMixin): #第三课新增def can(self, _):return Falsedef is_admin(self):return Falselogin_manager.anonymous_user = AnonymousUser   #第三课新增@login_manager.user_loader  
def load_user(user_id): #第三课新增return User.query.get(int(user_id))

1.4.6 增加前端目录和页面

先建文件夹

      全路径:/myproject/frontend/base

新增页面html文件layout.html

       /myproject/frontend/base/layout.html

内容为:

<!doctype html>
<title>My Application</title>
{% with messages = get_flashed_messages() %}{% if messages %}<ul class=flashes>{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>{% endif %}
{% endwith %}
{% block body %}{% endblock %}

新增页面html文件index.html

    /myproject/frontend/base/index.html

{% extends "base/layout.html" %}
{% block body %}<h1>Overview</h1>{% if current_user.is_authenticated %}<p>welcome ~ <a href="/account/logout">logout</a>{% else %}<p>Do you want to <a href="/account/login">log in?</a>{% endif %}
{% endblock %}

1.4.7 新增后端文件夹和文件

在/myproject/backend/下新增文件夹  admin

       全路径: /myproject/backend/admin

在admin下新增__init__.py和views.py

      /myproject/backend/admin/__init__.py内容为空

     全路径:/myproject/backend/admin/views.py

     内容如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
Created by liaoyangyang1 on 2018/8/23 上午11:09.
"""
from flask import Blueprint,render_template
from backend.account.views import login_requiredadmin = Blueprint('admin', __name__)@admin.route('/')
def index():return render_template('/base/index.html')

 

 二,测试登录


访问http://127.0.0.1:10101/admin/

显示内容为,意思就是你没登录,让你点登录:

概观

你想  登录吗?

点击后跳转页面,到我们一开始做的登录页面,网址为http://127.0.0.1:10101/account/login

输入账号密码登录,成功的话跳转回一开始的页面,但是显示内容变了:

 

  • 您现在已登录。欢迎回来!

概观

欢迎〜  注销

 

是不是很简单〜

三,本课代码


github:https:  //github.com/lyy8510a/myproject/releases/tag/v3

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_795994.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提高编程能力刷题网站

提高编程能力刷题网站 一、leetcode 网址&#xff1a;https://leetcode.com/ 账号信息&#xff1a; 账号BeiBicoder 密码 通常用的密码 二、coderwars https://www.codewars.com/ 三、virtual Judge https://vjudge.net/ 四、geeksforgeeks https://www.geeksforgeeks.org/ 五 …

生成元(Digit Generator ,ACM/ICPC Seoul 2005 ,UVa 1583)

生成元&#xff1a;如果 x 加上 x 各个数字之和得到y&#xff0c;则说x是y的生成元。 n&#xff08;1<n<100000&#xff09;,求最小生成元&#xff0c;无解输出0. 例如&#xff1a;n216 , 解是&#xff1a;198 198198216 解题思路&#xff1a;打表 循环将从1到10005&…

发一个自动刷网站PV流量的小工具

刷IP需要很多资源或财力&#xff0c;而刷PV却非常easy&#xff0c;一直要有一个能上网的机器&#xff0c;就能刷出N个PV值来。因为需要&#xff0c;写了个刷PV的小工具&#xff0c;可以设置要刷的页面&#xff0c;设置时间间隔。 下载

史前社交网站MySpace丢失12年间所有音频数据!因服务器迁移失败

3月19日&#xff0c;有外媒报道史前社交巨人MySpace在服务器迁移过程中由于服务器错误&#xff0c;导致MySpace上2003年到2015年间所有音视频数据全部丢失。 MySpace于2003年推出&#xff0c;在短短几年内成为大型音乐平台&#xff0c;乐队可以在上面分享自己的歌曲&#xff0c…

程序员删库跑路案例之 —— 这家网站首页变图片

百度智能云 云生态狂欢季 热门云产品1折起>>> 3月28日&#xff0c;网络上突然流传一则传言&#xff0c;称安徽汽车网程序员删库跑路&#xff0c;只留下3张图片做官网&#xff0c;令人咋舌。 目前访问其官网 http://www.ahauto.com/ &#xff0c;页面还是其网站的样子…

网站性能优化(website performance optimization)

提高代码运行速度&#xff0c;或许我们从来没有优化这些页面来提高速度 想要开发优秀的网站&#xff0c;你必须了解你的用户&#xff0c;知道他们想要达到什么目的&#xff0c;同时还要明白浏览器的工作原理&#xff0c;从而能够打造快速良好的体验&#xff0c;我最近在PageSpe…

Windows服务器(阿里云)搭建IIS网站+配置入站规则+端口权限

一、IIS搭建&#xff1a;Windows Server 2019 搭建IIS环境 教程 - 付杰博客 二、入站端口配置&#xff08;可以跳过&#xff0c;阿里后台配置就行&#xff0c;看第三步&#xff09; 三、阿里服务器的入站配置 3.1、登陆阿里后台 3.2、配置规则

pc端的企业网站(IT修真院test9)详解一个响应式完成的pc端项目

一&#xff1a;引入bootstrap框架 昨天一直被bootstrap栅格系统折磨。 why? 我本来想一边码字&#xff0c;一边学习栅格布局的。but不成功。这时我头脑已经昏了。 下午&#xff0c;我查看了bootstrap的官网&#xff0c;带着我的问题&#xff1a;究竟怎么使用bootstrap的框架呢…

友盟统计网站需要收费吗_职业教育网站需要做推广吗?网站推广方法有哪些?...

职业教育网站唯有做好推广才能在众多网站中脱颖而出&#xff0c;既能带来流量还能树立品牌形象&#xff0c;有利于企业的发展&#xff0c;职业教育网站做网站推广方法还是挺多的&#xff0c;如SEO、SEM、软文推广、微博推广等等。随着移动互联网的迅速发展和产业结构升级的持续…

第三百八十八节,Django+Xadmin打造上线标准的在线教育平台—网站列表分页

第三百八十八节&#xff0c;DjangoXadmin打造上线标准的在线教育平台—网站列表分页 分页可以用一个第三方分页模块django-pure-pagination 下载地址&#xff1a;https://github.com/jamespacileo/django-pure-pagination#settings 下载后安装此模块即可 使用pure-pagination分…

jq审核通过重定向跳转_关于网站进行301跳转

网站301跳转就是把页面永久性移走&#xff0c;也叫301重定向&#xff0c;301转向。指的是当用户点击一个网址时&#xff0c;通过技术手段&#xff0c;跳转到指定的一个网站。301跳转多用于旧网址在废弃前转向新网址以保证用户的访问&#xff0c;在诸多服务器中&#xff0c;均支…

moss2007自定义网站栏不显示

用moss2007建立了一个blog站点&#xff0c; 默认文章显示为: 并在“文章”列表中加入了一个自定义的栏"摘要”&#xff0c; 在首页中加入对"摘要"栏的显示设置: 保存后,在首页中就是显示不出来: 在点击修改时可以看到"摘要"栏的信息: 找了一下午,也没…

网站静态化(转)

找了一些关于网站静态化的文章&#xff0c;分享一下。网友方案一&#xff1a;做程序也做了将近4年时间了&#xff0c;从来没有发过什么技术性的文章&#xff0c;今天发一个只在大家一起共同学习进步&#xff0c;如有错误地方请指正。 最近自己做了一个做网络广告的网站叫全方位…

杜绝Cookie传送提高网站访问速度

最近在做网站的优化&#xff0c;其中一项包括&#xff1a;对静态文件&#xff08;如图片&#xff0c;JS脚本文件及CSS文件&#xff09;启用一个新的独立域名&#xff0c;以杜绝不必要的Cookie传送&#xff0c;提高请求速度并减少带宽。   我们知道&#xff0c;当向HTTP服务器…

CentOS 上搭建 WordPress 网站

简介&#xff1a; WordPress是使用PHP语言开发的博客平台&#xff0c;在支持PHP和MySQL数据库的服务器上&#xff0c;您可以用WordPress架设自己的网站&#xff0c;也可以用作内容管理系统&#xff08;CMS&#xff09;。本文主要为大家介绍如何在CentOS系统的ECS实例上搭建Word…

长尾词推广系统推荐乐云seo_万词霸屏网络推广效果怎么样

信息传播一直伴随在我们的生活当中&#xff0c;而且信息传播在一些领域是非常重要的&#xff0c;尤其是在企业要提高知名度和一些新的产品要推广方面尤其重要。自从有了互联网之后信息传播速度也加快了、从此也就有了外推团队&#xff0c;企业中的外推团队最开始就是发发新闻稿…

linux shell监控网站延迟,使用shell脚本监控网站运行状态

前言&#xff1a;好久没有写博客了&#xff0c;上来把之前写的博客几乎全都清理掉了&#xff0c;想写的时候写上一些&#xff0c;蛮不错。shell监控网站/tomcat状态&#xff0c;依靠返回状态码来进行判断&#xff0c;返回200,302认为状态是正常的&#xff0c;否则认为tomcat/ng…

优化网站设计(三十二):使favicon.ico文件尽可能小并且可以缓存

前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议。这方面的研究一直没有停止过&#xff0c;我在不同的场合也分享过这样的话题。 作为通用的原则&#xff0c;雅虎的工程师团队曾经给出过35个最佳实践。这个列表请参考 Best Practices fo…

x教学html,css网站布局实录学习笔记第二部分XHTML与CSS基础

第二章 XHTML与CSS基础2.1 XHTML基础XHTML是网页代码的核心内容&#xff0c;标准XHTML代码如下&#xff1a;复制代码代码如下:ttp://www.w3">http://www.w3 .org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/1999/xhtml">新建文档对于这…

Jsoup开发网站客户端第二篇,图片轮播,ScrollView兼容ListView

最近一段日子忙的焦头烂额&#xff0c;代码重构&#xff0c;新项目编码&#xff0c;导致jsoup开发网站客户端也没时间继续下去&#xff0c;只能利用晚上时间去研究了。今天实现美食网首页图片轮播效果&#xff0c;网站效果图跟Android客户端实现如图&#xff1a; 从浏览器开发者…