澳门威利斯人_威利斯人娱乐「手机版」

来自 办公软件 2020-01-27 03:09 的文章
当前位置: 澳门威利斯人 > 办公软件 > 正文

如何掌握这些框架使用,将Redis操作封装成Model

Model类遵照Redis数据类型自动调用相应的原生方法。

1.接口:

python中并从未近似java等任何语言中的接口类型,可是python中有抽象类和虚幻方法。即便三个抽象类有抽象方法,那么继续它的子类必得达成抽象类的具备办法,由此,大家依照python的抽象类和浮泛方法完毕接口功效。

示范代码:

图片 1图片 2

from abc import ABCMeta
from abc import abstractmethod #导入抽象方法

class Father(metaclass=ABCMeta):#创建抽象类
    @abstractmethod
    def f1(self):pass
    @abstractmethod
    def f2(self):pass

class F1(Father):
    def f1(self):pass
    def f2(self):pass
    def f3(self):pass
obj=F1()

接口示例代码

  Maven那个个项目管理和创设自动化学工业具,越来越多的开荒人士使用它来治本项目中的jar包。可是对于大家程序猿来讲,大家最关心的是它的门类营造功效。

为此,小编写了三个开源的库redisun,将Redis常用的操作封装成了就像数据库查询语句的办法。

4.UI层

UI层首要肩负作业管理完了后与前面一个的互相,它是劳务层Service的调用者:

演示代码:

class Login(AdminRequestHandler):

    def get(self, *args, **kwargs):
        is_login=self.session["is_login"]
        current_user=""
        if is_login:
            current_user=self.session["user_info"].username
        self.render('Account/Login.html',current_user=current_user)

    def post(self, *args, **kwargs):
        user_request=[]
        #获取用户输入的用户名邮箱密码
        user_request.append(self.get_argument('name',None))
        user_request.append(self.get_argument('email',None))
        user_request.append(self.get_argument('pwd',None))
        checkcode=self.get_argument("checkcode",None)
        Mapper.mapper(*user_request)
        obj=UserService.check_login()
        self.session["is_login"]=True
        self.session["user_info"]=obj.modelView
        self.write("已登陆")

 

     总括以上就是依照领域驱动模型的顾客管理后台,包涵数据库操作文件,数据库业务处理公事,服务端文件,UI层文件。若是本文对你有参照他事他说加以考察价值,应接帮博主点下文章下方的引荐,感激!

 

 

 

 

  Lazy loading 懒加载

未有差距于调用redis的原生方法hmset更新user:1:profile对应的多寡。

二、集团级应用设计

  三、Mybatis

越多特点请看redisun

3.接下来大家看一下劳务层service:

service也是多少个承前启后的效应,它调用Moldel文件对应的数据库业务协和艺术,并被相应的UI层调用(本例中是UIadmin)。

目录构造:

图片 3

无差距于的,大家只介绍User文件夹:它含有4个py文件:

  • ModelView:用于客商前端体现的数额格式化,器重对user_type_id、vip_type_id扩张对应的顾客类型和VIP级别,就要外键数据对应的caption放在外键后边,作为扩展的参数。
  • Request:封装央求Moldel文件对应数据库协调类的参数
  • Response:封装供给回到UI层的参数
  • Sevice:主题服务管理文件

下面对上述目录做详细代码:

ModelView:

class UserModelView:

    def __init__(self, nid, username, email, last_login, user_type_id, user_type_caption, vip_type_id, vip_type_caption):
        self.nid = nid
        self.username = username
        self.email = email
        self.last_login = last_login
        self.user_type = user_type_id
        self.user_type_caption = user_type_caption
        self.vip_type = vip_type_id
        self.vip_type_caption = vip_type_caption

  注:对user_type_id、vip_type_id扩展对应的客商类型和VIP品级,将要外键数据对应的caption放在外键前面,作为扩大的参数。

Request:

class UserRequest:

    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.password = password

  Response:

class UserResponse:

    def __init__(self, status=True, message='', model_view=None):
        self.status = status    # 是否登陆成功的状态
        self.message = message  #错误信息
        self.modelView = model_view  #登陆成功后的用户数据 

UserService:

class UserService:

    def __init__(self, model_user_service):   #通过依赖注入Moldel对应的数据库业务协调方法,此例中对应上文中的user_service
        self.modelUserService = model_user_service   

    def check_login(self, user_request):  #核心服务层业务处理方法
        response = UserResponse()  #实例化返回类

        try:
            model = self.modelUserService.check_login(user_request.username, user_request.email, user_request.password) #接收上文中的用户基本信息,是User类的实例
            if not model:
                raise Exception('用户名或密码错误')
            else:   #如果登陆成功,通过UserModelView类格式化返回前端的数据
                model_view = UserModelView(nid=model['nid'],
                                           username=model['usename'],
                                           email=model['email'],
                                           last_login=model['last_login'],
                                           user_type_id=model['user_type'].nid,
                                           user_type_caption=model['user_type'].caption,
                                           vip_type_id=model['vip_type'].nid,
                                           vip_type_caption=model['vip_type'].caption,)
                response.modelView = model_view    #定义返回UI层的用户信息
        except Exception as e:
            response.status = False
            response.message = str(e)

  总括:至此,Service重回给Ui层的数目是是或不是登录成功的场合status、错误音讯、已经格式化的客户大旨音讯。

  八、Ehcache

$model->where->update([ 'name' => 'Maria', 'age' => '22',]);

   本博文将一步步揭破京东等大型网址的小圈子驱动模型,致力于让读者完全调控这种互连网结构中的“男神”。

  视图(View卡塔尔(قطر‎是担任突显模型数据和日常它生成的HTML输出,客商端的浏览器能够解释。

Redis经常作为意气风发种内部存款和储蓄器化的数据库使用,将Redis封装成Model,同风流倜傥业务种类数据的操作都坐落叁个Model里,那样能够提升代码的可维护性。

豆蔻梢头、预备知识:

  Resource pooling 资源池

比方二个key情势为user:{id}:profile的Hash类型的Model,更新操作

2.信赖注入:

重视注入的职能是将风度翩翩雨后春笋毫不相关的类经过注入参数的方法实现关系,举个例子将类A的靶子作为参数注入给类B,那么当调用类B的时候,类A会首先被实例化。

示范代码:

图片 4图片 5

class Mapper:
    __mapper_ralation={}
    @staticmethod
    def regist(cls,value):
        Mapper.__mapper_ralation[cls]=value

    @staticmethod
    def exist(cls):
        if cls in Mapper.__mapper_ralation:
            return True
        else:
            return False
    @staticmethod
    def value(cls):
        return Mapper.__mapper_ralation[cls]

class Mytype(type):
    def __call__(cls, *args, **kwargs):
        obj=cls.__new__(cls, *args, **kwargs)
        arg_list=list(args)
        if Mapper.exist(cls):
            value=Mapper.value(cls)
            arg_list.append(value)
        obj.__init__(*arg_list)
        return obj

class Foo(metaclass=Mytype):
    def __init__(self,name):
        self.name=name

    def f1(self):
        print(self.name)
class Bar(metaclass=Mytype):
    def __init__(self,name):
        self.name=name

    def f1(self):
        print(self.name)

Mapper.regist(Foo,"666")
Mapper.regist(Bar,"999")

f=Foo()
print(f.name)
b=Bar()
print(b.name)

依靠于注入示例

注:原理:首先须要领会所有的事物皆对象类也是目的,类是有Type成立的,当类实例化的时候,会调用type类的call方法,call方法会调用new方法,new方法调用init方法。

  传入参数:为SQL的ID和传播参数对象

1.全部框架目录布局:

图片 6

备注:

  • Infrastructure:一些集体组件,比如md5加密,分页模块,session等。
  • Model :关于数据库的逻辑处理模块
  • Repository :数据访谈层,包蕴数据库的增删改查
  • Service :服务层,调用Model,包罗带有法规的乞请和重回
  • Statics:静态文件目录
  • UI层:业务管理
  • Views:模板文件
  • Application:tornado程序的起始文件
  • Config:配置文件
  • Mapper:正视注入文件,负担整个框架不一样类的依附注入

  Java十大常用框架:SpringMVC、Spring、Mybatis、Dubbo、Maven、RabbitMQ、Log4j、Ehcache、Redis、Shiro

2.率先大家从Moldel早先查阅:

文件目录:

图片 7

本文重要以顾客管理为例举办介绍,因而大家来关切一下User.py文件:

代码构造:

图片 8

下直面上述代码布局做生龙活虎一介绍:

IUseRepository类:接口类,用于约束数据库访问类的方法
示例代码:

class IUseRepository:
    """
    用户信息仓库接口
    """

    def fetch_one_by_user_pwd(self, username, password):
        """
        根据用户名密码获取模型对象
        :param username: 主键ID
        :param password: 主键ID
        :return:
        """
    def fetch_one_by_email_pwd(self, email, password):
        """
        根据邮箱密码获取模型对象
        :param email: 主键ID
        :param password: 主键ID
        :return:
        """

    def update_last_login_by_nid(self,nid,current_date):
        """
        根据ID更新最新登陆时间
        :param nid:
        :return:
        """

  从上述代码可以见到,数据库访谈类假诺世袭IUseRepository类,就亟须兑现此中的虚幻方法。

接下去的多少个类,VipType、UserType、User是与顾客消息相关的类,是数据库须求保留的多少,大家意在存入数据库的多寡格式为:nid 、username、email、last_login、user_type_id、vip_type_id,个中User类用于保存上述数量。因为user_type_id、vip_type_id存的是数字,即user_type_id、vip_type_id是外键,不能直接在前端实行显示,由此,大家创立了VipType、UserType类,用于依照id,获取相应的VIP级别和顾客类型。

示范代码:

图片 9图片 10

class User:
    """领域模型"""
    def __init__(self, nid, username, email, last_login, user_type, vip_type):
        self.nid = nid
        self.username = username
        self.email = email
        self.last_login = last_login
        self.user_type = user_type
        self.vip_type = vip_type

User类

图片 11图片 12

class UserType:

    USER_TYPE = (
        {'nid': 1, 'caption': '用户'},
        {'nid': 2, 'caption': '商户'},
        {'nid': 3, 'caption': '管理员'},
    )

    def __init__(self, nid):
        self.nid = nid

    def get_caption(self):
        caption = None

        for item in UserType.USER_TYPE:
            if item['nid'] == self.nid:
                caption = item['caption']
                break
        return caption

    caption = property(get_caption)

UserType类

图片 13图片 14

class VipType:

    VIP_TYPE = (
        {'nid': 1, 'caption': '铜牌'},
        {'nid': 2, 'caption': '银牌'},
        {'nid': 3, 'caption': '金牌'},
        {'nid': 4, 'caption': '铂金'},
    )

    def __init__(self, nid):
        self.nid = nid

    def get_caption(self):
        caption = None

        for item in VipType.VIP_TYPE:
            if item['nid'] == self.nid:
                caption = item['caption']
                break
        return caption

    caption = property(get_caption)

VipType类

注:VipType、UserType那七个类获取相应的caption均是经过类的常常性情访问,即相符字段方式访问。

接下去的类UserService是本py文件的要害,它负责调用对应的数据库访谈类的章程,并被劳务层service调用,具备承先启后的成效:

演示代码:

class UserService:

    def __init__(self, user_repository):
        self.userRepository = user_repository

    def check_login(self, username=None, email=None, password=None):

        if username:
            user_model = self.userRepository.fetch_one_by_user_pwd(username, password)
        else:
            user_model = self.userRepository.fetch_one_by_email_pwd(email, password)
        if user_model:
            current_date = datetime.datetime.now()
            self.userRepository.update_last_login_by_nid(user_model.nid, current_date)
        return user_model

  这里,我们第一介绍一下上述代码:

早先化参数user_repository:通过信任注入对应的数据库访谈类的目的;

check_login:访谈数据库的机要逻辑管理方法,依照客户是顾客名 密码方式依旧邮箱加密码的点子登录,然后调用对应的数据库管理方式,固然登入成功,更新时间和结尾登陆时间,最终将User类的实例重临给调用它的劳务层service。(详细见下文数据库管理类的情势)

我们先来看一下应和的数据库管理类中的多少个主意:

示例代码:

 def fetch_one_by_user_pwd(self, username, password):
        ret = None
        cursor = self.db_conn.connect()
        sql = """select nid,username,email,last_login,vip,user_type from UserInfo where username=%s and password=%s"""
        cursor.execute(sql, (username, password))
        db_result = cursor.fetchone()
        self.db_conn.close()

        if db_result:
            ret = User(nid=db_result['nid'],
                       username=db_result['username'],
                       email=db_result['email'],
                       last_login=db_result['last_login'],
                       user_type=UserType(nid=db_result['user_type']),
                       vip_type=VipType(nid=db_result['vip'])
                       )
        return ret

  这里大家使用pymysql实行数据库操作,以客商名 密码登录为例,若是数据库有对应的客户名和密码,将查询结果放在User类中开打开端化,至此,ret中封装了客商的整套主干音信,将ret重返给地点的check_login方法,即对应上文中的归来值user_model,user_model再次回到给调用它的劳动层service。

小结:Molde最后将包裹了客商主题音信的User类的实例再次回到给劳务层service。

  轻便地说,正是将那个与职业非亲非故,却为作业模块所联合调用的逻辑或义务封装起来,便于裁减系统的重新代码,减少模块间的耦合度,并利于今后的可操作性和可维护性。AOP代表的是一个横向的关联

  传入参数:为SQL的ID和传唱参数对象

  Context passing 内容传递

  2、软负载均衡及容错机制,可在内网代替F5等硬件负载均衡器,减弱本钱,减少单点。

  十、Shiro

  Error handling 错误管理

  调控器(Controller 卡塔尔国担任管理客商的央浼,并树立适宜的模型,并把它传递给视图渲染。

  MyBatis 是支撑普通 SQL查询,存款和储蓄进程和高端映射的可观长久层框架。MyBatis 扑灭了大约具有的JDBC代码和参数的手工业安装以至结果集的物色。MyBatis 使用简单的 XML或评释用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象卡塔尔国映射成数据库中的记录。

  Dubbo是三个遍布式服务框架,致力于提供高性能和透明化的RPC(远程进度调用合同State of Qatar远程服务调用方案,甚至SOA服务治理方案。简单来讲,dubbo正是个劳务框架,若无布满式的必要,其实是无需用的,唯有在分布式的时候,才有dubbo这样的布满式服务框架的要求,况且本质上是个劳务调用的东东,说白了就是个长途服务调用的布满式框架。

  Apache Shiro是Java的一个逢凶化吉框架,意在简化身份验证和授权。Shiro在JavaSE和JavaEE项目中都能够应用。它根本用以管理身份认证,授权,公司会话管理和加密等。

本文由澳门威利斯人发布于办公软件,转载请注明出处:如何掌握这些框架使用,将Redis操作封装成Model

关键词: 澳门威利斯人 Redis 操作 Model t