Flask:08-一局王者建立自己的博客(02)

博客项目

上一篇内容完善

  • 自定义字段验证函数

    class RegisterForm(FlaskForm):
        ...
        def validate_username(self, field):
            user = User.query.filter(User.username == field.data).first()
            if user:
                raise ValidationError(‘该用户名已注册,请选用其他名称注册‘)
    
        def validate_email(self, field):
            user = User.query.filter(User.email == field.data).first()
            if user:
                raise ValidationError(‘该邮箱已注册,请选用其他邮箱注册‘)
    
  • 加密存储密码
    from werkzeug.security import generate_password_hash, check_password_hash
    
    class User(db.Model):
        ...
          @property
        def password(self):
            raise AttributeError(‘你瞅啥?!密码不可读‘)
    
        @password.setter
        def password(self, password):
            # 加密保存密码
            self.password_hash = generate_password_hash(password)
    
        # 密码校验,True:校验成功,False:校验失败
        def verify_password(self, password):
            return check_password_hash(self.password_hash, password)
    

用户登录退出

  • 登录校验逻辑

    @user.route(‘/login/‘, methods=[‘GET‘, ‘POST‘])
    def login():
        form = LoginForm()
        if form.validate_on_submit():
            u = User.query.filter(User.username == form.username.data).first()
            if not u:
                flash(‘无效的用户名‘)
            elif not u.confirmed:
                flash(‘账户尚未激活,请激活后再登录‘)
            elif not u.verify_password(form.password.data):
                flash(‘无效的密码‘)
            else:
                flash(‘登录成功‘)
                return redirect(url_for(‘main.index‘))
        return render_template(‘user/login.html‘, form=form)
    
  • flask-login扩展
    • 说明:它是一个专门用来管理用户登录退出的扩展库,使用非常方便。
    • 安装:pip install flask-login
    • 使用:
    # 第一步:添加扩展
    from flask_login import LoginManager
    
    login_manager = LoginManager()
    
    def init_extensions(app):
        ...
        login_manager.init_app(app)
        # 指定登录端点
        login_manager.login_view = ‘user.login‘
        # 设置提示信息
        login_manager.login_message = ‘登录后才可访问‘
    
    # 第二步:让模型类类基础子UserMixin类,以便拥有状态相关方法
    from flask_login import UserMixin
    
    class User(UserMixin, db.Model):
          ...
    
    # 第三步:实现回调函数(根据用户id返回用户对象)
    @login_manager.user_loader
    def load_user(uid):
        return User.query.get(uid)
    
    • 总结
    状态切换:
        login_user            # 还可以完成记住我的功能(时间也可以指定)
        logout_user
    状态查询:
        is_authenticated    # 登录状态
        is_anonymous        # 匿名状态
    路由保护:
        login_required        # 保护需要登录才可访问的路由
    当前用户:
        current_user        # 在模板中使用不需要分配
    

用户信息管理

  • 详情信息展示

    • 添加点击跳转链接及逻辑
    • 书写详情页面的展示效果
  • 修改密码
    • 添加点击跳转链接
    • 模板文件中添加表单(原始密码、新密码、确认密码)
    • 添加点击提交校验的逻辑
#修改密码
@user.route(‘/modifypassword/‘,methods=[‘GET‘,‘POST‘])
def modify_password():
    form = ModifyPasswordForm()
    if form.validate_on_submit():
        if current_user.verify_password(form.password.data):
            current_user.password = form.password_new1.data
            flash(‘修改密码成功‘)
            return redirect(url_for(‘user.login‘))
        else:
            flash(‘原始密码错误‘)
    return render_template(‘user/modify_password.html‘, form=form)
  • 修改邮箱

    • 添加点击跳转链接
    • 模板文件中添加表单(新邮箱)
    • 添加点击提交校验的逻辑(向新的邮箱地址发送确认邮件,需要携带用户信息及新邮箱地址)
    • 添加邮箱修改确认的校验视图函数(解析携带数据,修改用户邮箱)
#修改邮箱
@user.route(‘/modifyemail/‘,methods=[‘GET‘,‘POST‘])
def modify_email():
    form = ModifyEmailForm()
    if form.validate_on_submit():
        if current_user.email == form.email.data:
            s = Serializer(current_app.config[‘SECRET_KEY‘],expires_in=3600)
            token = s.dumps({‘id‘:current_user.id,‘email‘:form.email_new.data})
            send_mail(‘邮箱修改‘,form.email_new.data,‘email/modify_email_activate.html‘,username=current_user.username,token=token)
            flash(‘请前往新邮箱确认修改‘)
            return redirect(url_for(‘user.profile‘))
        else:
            flash(‘原始邮箱不正确‘)
    return render_template(‘user/modify_email.html‘,form=form)
  • 找回密码

    • 在登录页面添加找回密码的跳转链接
    • 跳转的模板文件中添加表单(用户名/邮箱地址),提交改为下一步
    • 添加提交的校验逻辑(向用户的邮箱发送邮件,需要携带用户身份信息)
    • 添加重新设置密码的视图函数(给出再次设置密码的表单,并处理提交)
# 找回密码
@user.route(‘/findpassword/<way>/‘, methods=[‘GET‘, ‘POST‘])
def find_password(way):
    form = FindPasswordForm()
    s = Serializer(current_app.config[‘SECRET_KEY‘], expires_in=3600)
    if form.validate_on_submit():
        u = User.query.filter(
            or_(User.username == form.username_email.data, User.email == form.username_email.data)).first()
        if u:
            token = s.dumps({‘id‘: u.id})
            # send_mail(‘通过用户名找回密码‘,u.email,‘email/find_password_activate.html‘,username=u.username,token=token)
            flash(‘请前往邮箱确认找回密码‘)
        else:
            flash(‘用户名错误‘)
            return redirect(url_for(‘user.login‘))
    return render_template(‘user/find_password.html‘, form=form)

@user.route(‘/findpasswordactivate/<token>/‘, methods=[‘GET‘, ‘POST‘])
def find_password_activate(token):
    form = NewPasswordForm()
    s = Serializer(current_app.config[‘SECRET_KEY‘])
    try:
        data = s.loads(token)
    except SignatureExpired as e:
        flash(‘token已过期,找回密码失败‘)
        return redirect(url_for(‘user.login‘))
    except BadSignature as e:
        flash(‘token有误,找回密码失败‘)
        return redirect(url_for(‘user.login‘))
    u = User.query.get(data[‘id‘])
    if form.validate_on_submit():
        u.password = form.password2.data
        db.session.add(u)
        flash(‘找回密码成功‘)
        return redirect(url_for(‘user.login‘))
    return render_template(‘user/new_password.html‘, form=form)
  • 修改头像

    • 添加点击跳转的链接
    • 添加flask-uploads扩展
    • 添加上传文件表单及校验逻辑
    • 添加上传文件的处理(生成随机文件名、生成缩略图、展示上传文件)
    • 将头像文件名保存到数据库(User模型需要添加字段)
    • 练习:用户详情页面展示用户头像
# 修改头像
@user.route(‘/icon/‘, methods=[‘GET‘, ‘POST‘])
def icon():
    form = UploadForm()
    if form.validate_on_submit():
        # 提取上传文件信息
        photo = form.photo.data
        # 提取文件后缀带点
        suffix = os.path.splitext(photo.filename)[1]
        # 生成随机文件名
        filename = random_string() + suffix
        # 用上传对象保存图片,并指定名字
        photos.save(photo, name=filename)
        # 拼接完整的图片路径
        pathname = os.path.join(current_app.config[‘UPLOADED_PHOTOS_DEST‘], filename)
        # 缩略图操作,打开文件
        img = Image.open(pathname)
        # 设置图片尺寸
        img.thumbnail((32, 32))
        # 重新保存,指定完整路径
        img.save(pathname)
        # 如果当前用户用的是默认头像,则不用删除
        # 若果用的不是默认头像,为减少存储需要先删除原来的头像
        if current_user.icon != ‘default.jpg‘:
            # os.remove删除项目本地文件
            os.remove(os.path.join(current_app.config[‘UPLOADED_PHOTOS_DEST‘], current_user.icon))
        # 新的头像准备好了,添加到model里
        current_user.icon = filename
        # 手动保存,可有可无
        db.session.add(current_user)
    # 头像已经保存到了static和model中,为了展示头像,可以把图片的路径传给模板
    # 静态文件是固定格式   注:不能直接写图片名,那样就写死了
    # 不同用户有独自的头像,所以用current_user.icon进行拼接
    img_url = url_for(‘static‘, filename=‘upload/‘ + current_user.icon)
    return render_template(‘user/icon.html‘, form=form, img_url=img_url)

博客管理

  • 博客发表

    • 添加发表博客表单及校验逻辑
    • 添加博客模型,用来保存博客
    • 添加博客校验保存
  • 博客展示(练习)

?

原文地址:https://www.cnblogs.com/swjblog/p/9741794.html

时间: 2024-10-09 17:07:52

Flask:08-一局王者建立自己的博客(02)的相关文章

使用wordpress建立企业或博客网站新手教程

前言   wordpress个开源的,知名的,拥有无数的插件和主题的知名blog/CMS php程序.全球数百万的网站通过wordpress建立或修改. 现在非常多的企业网站使用wordpress来建立和管理自己的企业网站或者博客网站.所以对于新手来说,如何建立自己的博客.网站呢? 1. 域名 对于一个网站来说,域名就是一个入口,一个身份证编号.就像我们都知道的百度,域名是baidu.com,所以,你也需要拥有自己的域名. 域名一般在60元左右1年,价格还是比较便宜的. 注册好你的域名后,将域名

Flask入门小项目 - 搭建极简博客(7)

目录: Flask入门小项目 - 搭建极简博客(1)介绍与项目结构 Flask入门小项目 - 搭建极简博客(2)添加主页 Flask入门小项目 - 搭建极简博客(3)添加登录.登出功能 Flask入门小项目 - 搭建极简博客(4)添加注册功能 Flask入门小项目 - 搭建极简博客(5)添加写文章功能 Flask入门小项目 - 搭建极简博客(6)添加删除文章功能 Flask入门小项目 - 搭建极简博客(7)部署到服务器,实现外网访问 完整程序点这 零.效果 域名的话要等它备案完才能访问... 一

linux命令:通过PHP、myql、httpd建立论坛、博客网站

php.mysql基础    需先安装httpd服务,使得web服务器启用. 一.安装PHP [[email protected] ~]# ls   #先下载rpm安装包 php53-5.3.3-23.el5_10.x86_64.rpm   sys  dead.letter     inittab.des3 php53-cli-5.3.3-23.el5_10.x86_64.rpm     sysroo1.gz  install.log.syslog php53-common-5.3.3-23.e

开门,建立MWEB的博客园连接!

已经想了好久,要开始写博客了,但是由于自己的懒惰,迟迟没有行动,今天下定了决心,以这个为开篇,开始输出自己的知识.今天就打开写博客的门,使用MWEB编辑器进行博客的编写并发布到博客园! 配置账户 打开MWEB的Preferences,点击Publishing选项卡,如下图: ? 选择右侧的Metaweblog API,弹出输入框 ? Blog URL为博客地址 Account为博客用户名 Password为博客密码 Publish URL为发布地址,此地址可以在博客的设置页面(最下面)找到,如我

《flask web开发》第11章 博客文章发布表单无法显示的解决方案

有不少同学在这一章都发现自己明明按照书上一步步执行,但却在首页看不到博客文章发布表单.这个问题其实很好解决. 首先,下载一个DB Browser for SQLite.Ubuntu用户可以在终端输入以下命令: sudo apt-get install sqlitebrowser 之后用这个数据库浏览器打开flasky里的数据库,在role表中按书中第9章所述,将所有角色手工录入,并在user表中给自己的账户添加上role_id字段,这样就大功告成了! 参考: https://www.zhihu.

万网虚拟主机如何建立两个博客网站?

作者:匿名用户链接:http://www.zhihu.com/question/28491981/answer/47442420来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 拿万网的云虚拟主机来试了下,用.htaccess可成功建两个站.一.在根目录创建文件.htaccess二.在根目录创建com和cn两个文件夹.三.在.htaccess文件添加以下内容. RewriteEngine OnRewriteBase /#不带www的301重定向到带www.Rewri

Flutter 即学即用系列博客——02 一个纯 Flutter Demo 说明

前言 上一篇文章我们搭建好了 Flutter 的开发环境. Flutter 即学即用--01 环境搭建 这一篇我们通过 Flutter 的一个 Demo 来了解下 Flutter. 开发系统:MAC IDE:Android Studio 目录 1. 创建一个 Flutter 项目 第一步:主界面点击创建 Flutter 项目 第一步:如果已经打开项目,则通过 File->New->New Flutter Project... 创建 第二步:默认选择 Flutter Application 即可

技术博客02 软件需求工程和UML建模第二组

校车座位预约系统 01 项目前景和范围 项目介绍: 校车座位预约系统,是面向全体在校师生的一款小程序,通过微信平台所提供的环境,搭建小程序来实现系统的各项功能.针对目前关于乘坐.等候校车所产生的问题给出解决方案.项目范围:       该系统提供给用户校车班次的信息表.预约以及取消预约通道.黑名单查询三项功能.项目产生原因:       校车一直以来是学生与老师往返与中关村和良乡的主要交通方式.也为需要进城办事的师生提供了比地铁更加快捷方便的交通方式.因此,一直以来,无论是周末还是工作日,都有大

django开发博客02

三种参数传递方式 1.URL后面跟参数的请求 例如url = 'http://127.0.0.1/test/1',这里面要传一个参数是'1' 这种需要在urls.py中定义 path('test/<int:id>', test), 当id=1的时候 请求的地址为'http://127.0.0.1/test/1' test这个函数需要传id 写法为: test(request,id): pass 2.另一种url后面跟参数的请求写法为 例如url = 'http://127.0.0.1/test