font
@font
В поисках самого лучшего

Верна ли форма регистрации на python?

Привет!
Собственно думаю, вот если на сайте не использовать MySQL, а сделать так:
#! /usr/bin/python3
# coding: UTF-8

db = {'user':'userpass','root':'rootpass','admin':'adminpass','moderator':'modepass'} # Это в качестве базы данных
new_user = input("Введите логин: ") #Здесь юзер вводит данные
new_user_pass = input("Введите пароль: ")
db[new_user] = new_user_pass #Добавляем логин:пароль в наш словарь

Думаю есть тыща способов сделать проще, но мне сказали лучше словарем.
Тут же еще нужны дополнительные данные: Город, аватар, настоящее имя и... че там еще лююди о себе указывают?
Ну в общем, я чет даже сомневаюсь в такой реализации, просто обдумываю идею.
На джанге наверное по-другому делается все
  • Вопрос задан
  • 3022 просмотра
Пригласить эксперта
Ответы на вопрос 3
@s1dney
Ну в целом-то оно, конечно, верно все. Но при повторном запуске переменная db будет в первоначальном состоянии.
Значит надо это дело куда-то сохранять, например писать в файл. Сценарий такой: открываем файл, читаем базу. Это ок.
Когда добавляется юзер надо добавить запись в базу + добавить запись в файл. Это уже не ок, потому что может вызвать несогласованность данных в этих 2-х словарях.
А если программа вылетит с ошибкой во время добавления пользователя? Значит надо предусмотреть срочный дамп текущего экземпляра словаря в файл при выходе. Это тоже не ок.

Можно продолжать так еще много, но я тут остановлюсь и просто скажу, что идея плохая. Бородатые дядьки почти 50 лет назад придумали классные штуки для работы с данными и сейчас они называются "традиционными", не нужно изобретать велосипед.
Ответ написан
@Derfirm
Noname Developer.
На самом деле быстрые сайты так или иначе используют традиционные базы данных. Как SQL так и NoSQL ;)
Ответ написан
@bromzh
Drugs-driven development
Самый простой способ - это использовать OpenID для аутентификации. После успешного ответа сервера тебе приходят некоторые данные пользователя, но их хранить не обязательно. БД можно не использовать, просто храни куку некоторое время.
Ну а если нужно хранить какие-то дополнительные данные - храни их в классовом поле некого класса.
class User(object):
    clients = set()  # можно использовать и список
                     # можно и словарь, чтобы быстро получать 
                     # конкретного пользователя по какому-то ключу

    def __init__(self, user=None, root=None, admin=None, moderator=None, **kwargs):
        self.user = user
        self.root = root
        self.admin = admin
        self.moderator = moderator
        # Записываем в класс необходимые поля из kwargs
        self.foo = kwargs.pop('foo', 'default_value')

    def auth(self):
        # тут аутентифицируем юзера
        # данные, которые пришли в ответ, можно записать в поля класса
        # после того, как всё записал, делай так:
        self.clients.add(self)  # добавляем подключившегося пользователя
        # Этот массив/сет/словарь будет доступен из любого экземпляра этого класса
        # и из самого класса тоже, например: [print(client) for client in User.clients]

# чтобы хранить данные между перезагрузкой сервера, можно использовать pickle:
import pickle
with open('foo.pickle', 'w') as f:
    pickle.dump(f, User.clients)
# загружать так же:
with open('foo.pickle'. 'r') as f:
    User.clients = pickle.load(f)

Вот простой пример, чтобы было яснее:
>>> class A(object):
...     c = list()
...     def __init__(self, **kwargs):
...         self.__dict__.update(**kwargs)
...     def save(self):
...         self.c.append(self)
... 
>>> a = A(a=1, b=2)
>>> a.save()
>>> b = A(a=[3, 4], foo={1, 2})
>>> b.save()
>>> A.c
[<__main__.A object at 0x7fd63603d0b8>, <__main__.A object at 0x7fd63603dc18>]
>>> pickle.dumps(A.c)
b'\x80\x03]q\x00(c__main__\nA\nq\x01)\x81q\x02}q\x03(X\x01\x00\x00\x00bq\x04K\x02X\x01\x00\x00\x00aq\x05K\x01ubh\x01)\x81q\x06}q\x07(X\x03\x00\x00\x00fooq\x08cbuiltins\nset\nq\t]q\n(K\x01K\x02e\x85q\x0bRq\x0ch\x05]q\r(K\x03K\x04eube.'
>>> A.c = []
>>> A.c = pickle.loads(b'\x80\x03]q\x00(c__main__\nA\nq\x01)\x81q\x02}q\x03(X\x01\x00\x00\x00bq\x04K\x02X\x01\x00\x00\x00aq\x05K\x01ubh\x01)\x81q\x06}q\x07(X\x03\x00\x00\x00fooq\x08cbuiltins\nset\nq\t]q\n(K\x01K\x02e\x85q\x0bRq\x0ch\x05]q\r(K\x03K\x04eube.')
>>> A.c
[<__main__.A object at 0x7fd63604ca58>, <__main__.A object at 0x7fd63604c908>]
>>> A.c[0].a
1
>>> A.c[1].a
[3, 4]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы