Попытка создать логин пользователя для сайта Clojure / Korma / PostgreSQL

Я полностью застрял на том, с чего начать с получения зоны входа на сайт Clojure, который я создаю (для развлечения).

Я посмотрел на несколько ресурсов, которые я опубликую ниже, беспощадно копирую / вставляю код, и ближе всего я могу получить одну из двух ситуаций:

Страница входа принимает имя входа, но говорит, что вход не выполнен, хотя, насколько я могу судить, вход совпадает.

Или я получаю эту ошибку: Нет метода в multimethod '->sql' для значения отправки: null

Я не уверен, как интерпретировать вышеупомянутую ошибку: это указывает, что мне нужен мульти-метод, или это указывает, что мне нужно проверить на ноль? Нулевое требование не имеет никакого смысла вообще. Я на самом деле не спрашиваю, но если кто-то хочет дать объяснение, это здорово.

Я проверил вывод, сравнив результаты запросов к выбору из необработанных необработанных данных, я прошел через 5 вариантов этой темы, используя все от вызовов "страница-к-странице" до создания новых функций по умолчанию, нескольких методов, определения, так далее.

Источники, которые я использовал (к сожалению, я не могу перечислить все из них, как первый постер):

Этот использует Clojure -> Korma -> PostgreSQL, но кажется, что код не работает для нескольких пользователей?
http://www.vijaykiran.com/2012/01/17/web-application-development-with-clojure-part-2/

Этот пример показывает, как использовать Noir и PostgreSQL (да, я использую Noir): https://yogthos.net:11794/blog/23-Noir+tutorial+-+part+2

Сайт 4Clojure, но этот использует CongoMongo:

Клон Heroku Twitter, но нет упоминаний о том, как создавать логины для одного человека, а тем более нескольких.

Я также купил Программирование Clojure от О'Рейли Пресс, но опять же, ничего о том, как создать область входа в систему.

ПЕРВОЕ РЕДАКТИРОВАНИЕ: меня попросили создать репозиторий github для отдельного сайта. Это включает в себя рабочую область "Создание учетной записи", которая находится в файле welcome.clj, и только форму области "Вход в систему" ​​в login.clj.

Я пытался заставить работать некоторые из тех же ошибок, что и прошлой ночью, а также пытался заставить их работать до того, как загрузил файлы. У меня пока нет разумных отправных точек, поэтому пока нет начала реализации. Я серьезно смущен решениями, которые я придумываю, поэтому я не хочу публиковать их. Я концептуально понимаю, что должен делать, но по какой-то причине не могу перевести это. Это моя первая учетная запись на github: мой опыт работы с Python, Scheme a'la SICP и какой-то маркетинговой программой Python + PostgreSQL, которую я создал.

ВТОРОЙ РЕДАКТИРОВАТЬ: Ack! Кажется, я не могу заставить эту вещь работать вообще... Да, я потратил более 20 минут (часов) на эту, так что я просто должен признать, что у меня пока нет необходимых знаний для достижения цели. это, независимо от того, сколько источников я смотрю. Я передал обновленные файлы и все странные вещи, которые я пробовал, включая все варианты в окне входа в систему, для запуска сырого SQL. Самое близкое, что я могу получить, это получить его, чтобы я не получил никаких ошибок, но никаких доказательств того, что кто-то вошел в систему. Большое спасибо за помощь и предложения. Я наверняка вернусь к этому позже.

https://github.com/dt1/noirKormaLogin

1 ответ

Решение

Есть пара вопросов, которые я вижу. Первый в datapass.cljвы создаете сущность без контента. Я не уверен, как Корма справляется с этим. Он пытается передать результаты в качестве входных данных для других функций, поэтому я мог видеть, как nil познакомится там.

Во-вторых, вам нужно что-то для обработки сообщения входа в систему. (defpage ...) только обрабатывает запросы GET по умолчанию. Вам понадобится отдельный defpage обрабатывать почту. Что-то вроде этого:

(defpage [:post "/login"] {:keys [user-name pwd]}
  (if-let [user (db/find-user user)]
    (if (noir.util.crypt/compare pwd (:password user))
       (do
         (noir.session/put! :some-key some-value)
         (noir.response/redirect "/success"))
       noir.response/redirect "/failed-to-login"))
  (noir.response/redirect "/failed-to-login"))

session/put! как вы помещаете данные в сессию. По умолчанию используется хранилище в памяти. Вам потребуется добавить промежуточное программное обеспечение Ring, чтобы использовать постоянные сеансы (см. Хранилища сеансов).

Кроме того, если повезет, кто-то только что опубликовал приложение аутентификации для Noir... вы можете посмотреть: https://github.com/xavi/noir-auth-app

Другие вопросы по тегам