Создание веб-сервиса для входа в python с помощью торнадо
Просто для того, чтобы знать, как работает торнадо (я начинающий с python и торнадо) для предоставления услуг на странице входа. У меня есть HTML-страница, которая отправляет параметры как {"data":{"Email":"adsf","Password":"asdf","Type":3}}
но я не знаю, как получить параметры в торнадо.
мой логин
import motor
import tornado.ioloop
import tornado.web
import http
client = motor.MotorClient('localhost', 27017)
db = client.yc
class LoginHandler(tornado.web.RequestHandler):
def get(self):
self.check_basic_auth()
do_stuff()
def post(self):
print("test")
def options(self):
print("option")
self._headers['Access-Control-Allow-Origin'] = '*'
self._headers['Access-Control-Allow-Headers'] = 'Content-Type'
from pprint import pprint
pprint(vars(self))
if __name__ == "__main__":
application = tornado.web.Application([
(r"/user", LoginHandler)
], db=db)
application.listen(5000)
tornado.ioloop.IOLoop.current().start()
пожалуйста, сообщите мне, как получить параметры и проверить их значениями в моем mongodb
заранее спасибо
Я просто новичок.
1 ответ
Пожалуйста, внимательно прочитайте руководство Tornado по аутентификации и безопасности. Я адаптировал это из руководства Торнадо для поиска записей пользователей в Mongodb:
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
return self.get_secure_cookie("user")
class MainHandler(BaseHandler):
def get(self):
if not self.current_user:
self.redirect("/login")
return
name = tornado.escape.xhtml_escape(self.current_user)
self.write("Hello, " + name)
class LoginHandler(BaseHandler):
def get(self):
self.write('<html><body><form action="/login" method="post">'
'Name: <input type="text" name="name">'
'Password: <input type="password" name="password">'
'<input type="submit" value="Sign in">'
'</form></body></html>')
@gen.coroutine
def post(self):
# TODO: salt and hash the password before storing in the DB, then salt
# and hash the user's input password before comparing.
username = self.get_argument("name")
password = self.get_argument("password")
doc = yield db.accounts.find_one({"name": username,
"password": password})
if doc:
self.set_secure_cookie("user", username)
self.redirect("/")
else:
# No such user or wrong password.
self.redirect("/login")
if __name__ == "__main__":
application = tornado.web.Application([
(r"/", MainHandler),
(r"/login", LoginHandler)
], cookie_secret='SOME RANDOM STRING')
application.listen(5000)
tornado.ioloop.IOLoop.current().start()
С этим кодом все еще есть некоторые проблемы: он должен показывать пользователю сообщение после перезагрузки страницы входа, что-то вроде "Неверное имя пользователя или пароль". Попробуйте этот фрагмент кода flash-сообщения.
Этот код также небезопасен: пароли хранятся в MongoDB в открытом виде, поэтому любой, кто может получить копию резервной копии базы данных, знает пароли ваших пользователей. Пароли должны быть засолены и хешированы перед сохранением в базе данных.
И, конечно же, для входа в систему вам потребуется защищенное соединение HTTPS.