美文网首页
用Socket搭建一个简易网站(三)

用Socket搭建一个简易网站(三)

作者: 我有一只碗 | 来源:发表于2018-02-16 20:57 被阅读0次

    上节课我们实现了用户的注册,其实并不是真正的注册,只是一个简单的POST请求,所以我们这次来实现一个正正的注册。
    我们使用简单的文件存储用户数据来初步的感受一下ORM机制。
    首先建立我们的模型。

    from .base import Model
    
    
    class User(Model):
        def __init__(self, username, password):
            self.username = username
            self.password = password
    

    我们这个模型集成了Model这个类,这个模型基类我简单的实现了一下。

    import json
    
    
    class Model:
        @classmethod
        def get_db_path(cls):
            return 'db/' + cls.__name__ + '.txt'
    
        @classmethod
        def create_obj(cls, save=True, **kwargs):
            if save:
                obj = cls(**kwargs)
                obj.save()
                return obj
            else:
                return cls(**kwargs)
    
        def save(self):
            """
            这里只实现了用户的增加
            常见的ORM框架的保存不仅可以添加而且还可以更新用户信息
            等做到用户个人信息的功能的时候我们再修改
            """
            with open(self.get_db_path(), 'a') as f:
                data_str = json.dumps(self.__dict__)
                f.write(data_str + '\n')
    
        @classmethod
        def all(cls):
            obj_list = []
            with open(cls.get_db_path()) as f:
                for line in f:
                    obj_dict = json.loads(line)
                    obj = cls.create_obj(save=False, **obj_dict)
                    obj_list.append(obj)
            return obj_list
    
        @classmethod
        def get_by(cls, **kwargs):
            objs = cls.all()
            for k, v in kwargs.items():
                for obj in objs:
                    if getattr(obj, k) == v:
                        return obj
    
        @classmethod
        def filter_by(cls, **kwargs):
            objs = cls.all()
            target_objs = []
            for k, v in kwargs.items():
                for obj in objs:
                    if getattr(obj, k) == v:
                        target_objs.append(obj)
            return target_objs
    

    下面我们再编写注册路由函数。

    def register(request):
        if request.method == 'GET':
            header = 'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n'
            body = template('register.html')
            user_data = [user.username for user in User.filter_by(password='123')]
            body = body.replace('{{ message }}', '<br>'.join(user_data))
            return header + '\r\n' + body
        elif request.method == 'POST':
            data = request.form()
            User.create_obj(**data)
            body = template('register.html')
            body = body.replace('{{ message }}', '注册成功')
            header = 'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n'
            return header + '\r\n' + body
        else:
            return error(request)
    

    GET请求我们显示所有已经注册的用户的用户名。
    这里我们简单的ORM就已经实现了,可以将用户的信息保存在文件中,也可以取出符合条件的用户。
    最后一步就是更新我们的路由字典了。

    router_dict = {
        '/': index,
        '/register': register,
    }
    

    完整代码:https://github.com/KEYYYYY/simple-server

    相关文章

      网友评论

          本文标题:用Socket搭建一个简易网站(三)

          本文链接:https://www.haomeiwen.com/subject/lfwptftx.html