美文网首页
用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