• 项目 04 数据库迁移工具,增加用户系统-用户中心


    项目 04 数据库迁移工具

    #1、安装一个版本迁移
    pip install alembic
    
    #2、初始化目录
    alembic init alembic
    
    #3、在alembic.ini文件第38行写入数据库地址
    
    #4、在env.py中修改1-12行和25行
    
    #5、创建一个models的account.py文件
    
    #6、输出操作命令
    alembic revision --autogenerate -m 'add  fields for user'
    
    #7、刷入数据库
    alembic upgrade head
    #关于输出命令
    alembic revison --autogenerate -m 'add post model' #添加post表
    
    alembic downgrade -1 #回退一个版本

       handles/main.py 更新

    import tornado.web
    import os
    from pycket.session import SessionMixin
    from utils import photo
    from utils.account import add_post_for,get_post_for
    
    class AuthBaseHandler(tornado.web.RequestHandler,SessionMixin):
        def get_current_user(self):
            return self.session.get('tudo_user_info')
    
    class IndexHandler(AuthBaseHandler):
        """
        Home page for user,photo feeds
        """
        @tornado.web.authenticated
        def get(self,*arg,**kwargs):
            posts = get_post_for(self.current_user)
            image_urls = [p.image_url for p in posts]
            self.render('index.html',images = image_urls)
    
    class ExploreHandler(AuthBaseHandler):
        """
        Explore page,photo of other users
        """
        def get(self,*arg,**kwargs):
            posts = get_post_for(self.current_user)
            thumb_urls = [p.thumb_url for p in posts]#拿到缩略图的url
            self.render('explore.html',images=thumb_urls)#打开explore文件并将图片放上去
    
    class PostHandler(tornado.web.RequestHandler):
        """
        Single photo page and maybe
        """
        def get(self,*arg,**kwargs):
            self.render('post.html',post_id = kwargs['post_id'])
    
    class UploadHandler(AuthBaseHandler):
        """
        接收图片上传
        """
        def get(self,*arg,**kwargs):
            self.render('upload.html')
    
        def post(self, *args, **kwargs):
            img_files = self.request.files.get('newimg',None)
            for img in img_files:
                image_url = 'uploads/'+img['filename']#image的本地目录
                save_to = os.path.join(self.settings['static_path'],image_url)#保存路径为虚拟机路径加本地目录
                print("save_to {}".format(save_to))
                with open(save_to,'wb') as f:#打开本地目录的图片文件
                    f.write(img['body'])#保存文件内容
                full_path = photo.make_thumb(save_to)
                thumb_url = os.path.relpath(full_path,self.settings['static_path'])#相当于full_path减去settings['static_path']
                add_post_for(self.current_user,image_url,thumb_url)#获取用户登录信息中的username
    
            self.write({'filename':img_files[0]['filename']})
            self.redirect('/explore')

      models/account.py 更新

    '''
    专门储存数据库的文件
    '''
    from datetime import datetime
    from sqlalchemy import (Column,Integer,String,DateTime,
                            ForeignKey)
    from sqlalchemy.sql import exists
    from sqlalchemy.orm import relationship
    
    from .db import Base,DBSession
    
    session = DBSession()
    
    class User(Base):
        __tablename__ = 'users'
    
        id = Column(Integer,primary_key=True,autoincrement=True)
        name = Column(String(50),unique=True,nullable=False)
        password = Column(String(50),nullable=False)
        created = Column(DateTime,default=datetime.now)
        email = Column(String(50))
        last_login = Column(DateTime)
    
    
        def __repr__(self):
            return '<User(#{}:{})>'.format(self.id,self.name)
    
        @classmethod
        def is_exists(cls,username):#判断用户名是否存在
            return session.query(exists().where(User.name==username)).scalar()
    
        @classmethod
        def add_user(cls,username, password, email=''):#添加用户函数
            user = User(name=username,password=password,
                        email=email, last_login=datetime.now())
            session.add(user) #初始化实例
            session.commit() #刷入
    
        @classmethod
        def get_pass(cls,username): #获取数据库用户的密码函数
            user = session.query(cls).filter_by(name=username).first() #通过数据库查询获取用户密码
            if user:
                return user.password #获取用户密码
            else:
                return ''
    
    class Post(Base):
        '''
        保存用户图片信息
        '''
        __tablename__ = 'posts'
    
        id = Column(Integer,primary_key=True,autoincrement=True)
        image_url = Column(String(80))
        thumb_url = Column(String(80))
    
        user_id = Column(Integer,ForeignKey('users.id'))
        user = relationship('User',backref = 'posts',uselist = False,cascade = 'all')# user是User的一个实例
    
        def __repr__(self):
            return "<Post(#{})>".format(self.id)
    
    if __name__=='__main__':
        Base.metadata.create_all()

      utils/account.py

    '''
    用户相关的函数
    '''
    
    import hashlib#系统自带的加密库 hash加密
    from models.account import User,session,Post
    from datetime import datetime
    
    
    def hash_it(password):#密码加密函数
        return hashlib.md5(password.encode('utf8')).hexdigest()
    
    
    def authenticate(username,password):
        '''
        用户密码匹配判断函数,认证
        :param username:
        :param password:
        :return:
        '''
        if username and password:
            hash_pass = User.get_pass(username)# 获取数据库密码
            if hash_pass and hash_it(password) == hash_pass:#将用户输入的密码和数据库密码两两配对是否相同
                return  True
        return False
    
    def login(username):#记录登录时间函数,用于记录用户每次登录的时间
        t = datetime.now()
        print("user:{} login at {}".format(username,t))
        session.query(User).filter_by(name=username).update({User.last_login:t})#在数据库里面添加登录记录
    
        session.commit()#输入
    
    def register(username,password,email):
        '''
        提交数据到数据库
        :param username:
        :param password:
        :param email:
        :return:
        '''
        if User.is_exists(username):
            return {'msg':'用户名已存在'}
        hash_pass = hash_it(password)#加密
        User.add_user(username,hash_pass,email)
        return {'msg':'ok'}
    
    def add_post_for(username,image_url,thumb_url):#将路径保存到数据库
        '''
        保存特定用户的图片
        :param username:
        :return:
        '''
        user = session.query(User).filter_by(name=username).first()#拿到user
        post = Post(image_url=image_url,thumb_url=thumb_url,user=user)
        session.add(post)
        session.commit()
        # return post.id
    
    def get_post_for(username):
        '''
        查看用户图片
        :param username:
        :return:
        '''
        user = session.query(User).filter_by(name=username).first()
        posts = session.query(Post).filter_by(user=user) #返回的是实例的对象
        return posts
  • 相关阅读:
    JVM-堆内存
    生产者消费者模式-基于线程池
    nginx 499错误
    thrift入门
    RPC-基于原生java实现
    rocketMQ入门
    跟着刚哥深入学maven(通俗易懂)
    跟着刚哥学习Spring框架--AOP(五)
    跟着刚哥学习Spring框架--通过注解方式配置Bean(四)
    跟着刚哥学习Spring框架--Spring容器(二)
  • 原文地址:https://www.cnblogs.com/xuchengcheng1215/p/9152270.html
Copyright © 2020-2023  润新知