
www.youtube.com/watch?v=NisCkxU544cрдПрд░рд▓рд╛рдВрдЧ рдореЗрдВ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдПрд░рд▓рдВрдЧ рд╕рдореНрдореЗрд▓рди рд╕реЗ рдпреВрд░реА (
рдпрд╢рд╕реНрдХ )
рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ
рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж , рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рдЧрдИ рдФрд░ рдореИрдВрдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд╛рдЗрдЯ рдХреЛ рдиреЛрдб.рдЬреЗрдПрд╕ рдкрд░ рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рдПрд░рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдЕрдВрдд рдореЗрдВ, рдореИрдВ
рд╢рд┐рдХрд╛рдЧреЛ рдмреЙрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рдкрд╛рд░ рдЖрдпрд╛ред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рднреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рдпрд╛ рд╣реВрдВред
рдмреЙрд╕ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ? рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡реЗ рдЦреБрдж рдХреЛ "рд░реЗрд▓ рдХреА рддрд░рд╣, рд▓реЗрдХрд┐рди рдПрдХ рдПрд░рд▓рд╛рдВрдЧ" рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдореБрдЭреЗ рд░реЗрд▓ рд╕реЗ рднреА рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдереАред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдорд╡реАрд╕реА, рдЯреАрдХреЗ рдХреЗ рд╕рд╛рде рдирд┐рдкрдЯрд╛ред рдХрд╛рдо рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдареЛрд╕ ASP.NET MVC2 рд╣реИред рдЗрд╕рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред
рдЙрдкрд▓рдмреНрдз рдмреЙрд╕рдбреАрдмреА; рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, ActiveRecord, рд╡рд┐рднрд┐рдиреНрди рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реБрдП, рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдореЗрдореЛрд░реА, рдордиреЗрд╕рд┐рдпрд╛, рдореЛрдВрдЧреЛрдмреАрдбреА, рдорд╛рдИрдПрд╕рдХреНрдпреВрдПрд▓, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬред
рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ
рдЖрд╢реНрд╡рд╛рд╕рди рдХреЗ рдЕрдиреБрд╕рд╛рд░
, рдирдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЛрдб рдХреА рд▓рдЧрднрдЧ рддреАрди рд╕реМ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
Django рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ, рдлрд┐рд▓реНрдЯрд░, рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рд▓рдЧрднрдЧ рдкреВрд░реНрдг рдХрд╡рд░реЗрдЬ рд╣реИрдВред
рдРрд╕реА рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдЕрдм рддрдХ рдирд╣реАрдВ рдЦреЗрд▓рд╛ рд╣реИ ...
рд╕реНрдерд╛рдкрдирд╛
Ubunt рдкрд░ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЗ рд╕рд╛рде, рдереЛрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдереА, рдЬрд┐рд╕реЗ erangang рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдХреЗ рдФрд░ рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ (lib / kernel / src / inet_dns.hrl) рд╕реЗ рдХреЙрдкреА рдХрд░рдХреЗ рдЗрд▓рд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ ubunt рдбрд┐рд▓реАрд╡рд░реА рдореЗрдВ рдЧрд╛рдпрдм рд╣реИ; рдореБрдЭреЗ рдПрд░рд▓рд╛рдВрдЧ-рджреЗрд╡ рдкреИрдХреЗрдЬ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рдЙрд╕рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛
make make app NewSite cd ../NewSite
рд╣рдо рд╕рдордЭрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ ...
рдореВрд▓ рд░реВрдк рд╕реЗ,
рд╢рд┐рдХрд╛рдЧреЛ рдмреЙрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓
рдПрди рдЗрд╡рдирд┐рдВрдЧ рд╣реИ ред рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдФрд░ рдереЛрдбрд╝рд╛ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред
рдХрд╛рд░реНрдп
- рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ-рджреЛ рдкреЗрдЬ рд▓рд┐рдЦреЗрдВ
- рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд▓рд┐рдЦреЗрдВ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрдХ рд▓рд┐рдЦреЗрдВ
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛
/controller /view /model /log /static /test
рдЗрди рддреАрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ
/admin - , / , /ebin - , /lang - . /lib - , . /mail - ,
рдпрджрд┐ рдЖрдк ./start-dev.sh рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмреЙрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдЧрд╛, рддрд╛рдХрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХреЗрдВ, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдЖрджрд░реНрд╢
рдореЙрдбрд▓ рдПрдкреАрдЖрдИрдореЙрдбрд▓ рдПрдХ рдорд╛рдирдХреАрдХреГрдд рдЗрд░рд╛рдВрдЧ рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреАрдЬ, рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрд╛рдирддрд╛ рд╣реВрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рд╡реИрд╕реЗ рд╣реА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдпрд╣ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓
-module(user, [Id, FirstName, LastName, Email, PasswordHash, CreateTime]). -compile(export_all).
рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдореЙрдбрд▓ рд╣реИред рдЗрд╕рдореЗрдВ рдЧреБрдг рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рддрд░реАрдХреЗ рд╣реИрдВред
Id рдпрд╛
Time рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЧреБрдг рд╡рд┐рд╢реЗрд╖ рд╣реИрдВред рдПрдХ - рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рд▓рд┐рдВрдХ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ рдХреЗрд╡рд▓ рдЙрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЯреНрдпреВрдкрд▓ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ рдЬреЛ
рдПрд░рд╛рдВрдЧ рджреЗрддрд╛ рд╣реИ
: рдЕрдм)рдореЙрдбрд▓ рдХреЛрдб рдХреЗ рдмрд╛рдж
/models/user.erl рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ - рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ
рдкреИрдирд▓ рдореЗрдВ рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдореЙрдбрд▓ рдХреА рд╕реВрдЪреА, рдФрд░ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред
рдЖрдк рдореЙрдбрд▓ рдкрд░ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред
BossDB
рдмреЙрд╕рдбреАрдмреА рдПрдкреАрдЖрдИрдпрд╣ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд╣реИред
рдмреЙрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХреА рдПрдХ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рд╕рднреА рдЕрднрд┐рд▓реЗрдЦреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ
<model_atom> - <unique_id> , рдЬрд╣рд╛рдВ model_atom рдореЙрдбрд▓ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкрд░рдорд╛рдгреБ рд╣реИ :) рдФрд░ unique_id рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдореЙрдбрд▓реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж рднреА рдирд╣реАрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ рдореЙрдбрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд▓реЗрдЦ,
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ -1 рдФрд░
рд▓реЗрдЦ -1 рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ erlang рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдПрдБ RAM рдХреА рдорд╛рддреНрд░рд╛ рд╕реЗ рд╕реАрдорд┐рдд рд╣реИрдВ - рдЖрдк id рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ :)ред
рдЦреЛрдЬ рдЕрднрд┐рдпрд╛рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╣реИ, рдЬреЛ рдЧрдгрд┐рддреАрдп рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐,,,,, рдФрд░ рдЕрдиреНрдпред
рдирдореВрдиреЗ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрдИрдбреА рд░рд┐рдХреЙрд░реНрдб рдкрд╛рд╕ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЙрдбрд▓ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рд╣реИ - рдХреЛрдИ рднреНрд░рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
User = boss_db:find("user-1").
рдирд┐рдпрдВрддреНрд░рдХ
рдирд┐рдпрдВрддреНрд░рдХ рдПрдкреАрдЖрдИрдирд┐рдпрдВрддреНрд░рдХ рднреА рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдореЙрдбреНрдпреВрд▓ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдпрд╣ рд╡рд╣ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ http рдЕрдиреБрд░реЛрдз рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб (POST рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдФрд░ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред
-module(user_controller, [Req]). -compile(export_all). index('GET', []) -> ok.
рдпрд╣рд╛рдВ рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдВрддреНрд░рдХ рд╣реИ рдЬреЛ рдЬреАрдИрдЯреА рдЕрдиреБрд░реЛрдз
/ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ / рд╕реВрдЪрдХрд╛рдВрдХ рдкрддреЗ рдкрд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдмрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛
рдЖрдк рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕рдХреА рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рднреА рд╕рдордЭрддрд╛ рд╣реИред
URL рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
-module(user_controller, [Req]). -compile(export_all). index('GET', []) -> {ok, [{users, boss_db:find(user, [])}]}; index('GET', ["id", Id, "method", Method]) -> case boss_db:find(Id) of {error, Reason} -> boss_flash:add(Req, error, "Invalid User", "User not found"), ok; {user, User} -> case Method of "json" -> {json, User}
рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?
рдпрджрд┐ рдХреЛрдИ рд░рд┐рдХреНрдд рдЕрдиреБрд░реЛрдз рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдХреА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдвреВрдВрдвреЗрдВ, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрдХрд░ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реЛрдВрдЧреЗред
рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЖрдИрдбреА рдФрд░ рд╡рд┐рдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ - рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдИ-рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдмреЙрд╕_рдлреНрд▓реИрд╢ рдмрдирд╛рдПрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВред
рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рдХрд░реЗрдВ - рдпрджрд┐ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ "json" рд╣реЛ - рдбреЗрдЯрд╛ рдХреЛ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдПрдВред рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред
рдЯреЗрдореНрдкрд▓реЗрдЯ
рдЯреЗрдореНрдкрд▓реЗрдЯ рдПрдкреАрдЖрдИErlyDTL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Django рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ
{{boss_flash}} {% if users %} <h1>{% trans "User List" %}</h1> {% for user in users %} {% trans "First Name" %} : {{ user.first_name }}</br> {% trans "Last Name" %} : {{ user.last_name }}</br> <a href="/user/id/{{user.id}}/method/html">{% trans "View" %}</a> <a href="/user/id/{{user.id}}/method/json">{% trans "JSON" %}</a> {% endfor %} {% endif %} {% if user %} <h1>{% trans "User Info" %}</h1> {% trans "First Name" %} : {{ user.first_name }}</br> {% trans "Last Name" %} : {{ user.last_name }} {% endif %}
рдЯреНрд░рд╛рдВрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЗрди рдлреАрдб рдХрд░реЗрдЧрд╛ред рд╕рд╛рде рд╣реА, рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджрд░реНрдЬ рдХрд░реЗрдВред рдлрд╛рдЗрд▓реЗрдВ - рдирд┐рдпрдорд┐рдд *
рдмреЙрд╕_рдлреНрд▓реЗрд╢ рдЕрд╕реНрдерд╛рдпреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдпрд╛ рдЫрд┐рдкреЗ рд╣реБрдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рддреНрд░ рдпрд╛ рдкрд╛рд╕рд┐рдВрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╣реБрдд рд╕рд╣рдЬ рд╣реИред ASP.Net MVC рдореЗрдВ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рд╛рдзрд┐рдХрд░рдг
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЪрд╛рд▓рд╛рдХреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ,
рдЖрдк__ 1 рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдирд╛рдо рдПрдХреНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░
рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯрдкрд▓
{рдУрдХреЗ, рдПрдбрд┐рд╢рдирд▓рдкреИрд░реЗрдЯрд░реНрд╕ } рдпрд╛
{рд░рд┐рдбрд╛рдпрд░реЗрдХреНрдЯ, тАЬ/ url / to / redirectтАЭ} рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред
рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реЗ
/ lib рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
-module(auth_lib). -export(require_authentication/1). require_authentication(Req) -> case boss_session:get_session_data(Req, principal) of {error, Reason} -> {redirect, "/login"}; PrincipalId -> case boss_db:find(PrincipalId) of {error, Reason} -> boss_flash:add(Req, error, "User not found", Reason), {redirect, "/error"}; {user, Principal} -> {ok, Principal}
рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
-module(protected_controller, [Req]). -compile(export_all). before_("public") -> ok;
рдпрджрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рдлрд▓ рд░рд╣рд╛, рддреЛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдЗрд╕реЗ / рд▓реЙрдЧрд┐рди рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд┐рдХреЙрд░реНрдб рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ / рддреНрд░реБрдЯрд┐ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдм рдЖрдкрдХреЛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
-module(login_controller, [Req]). -compile(export_all). index('GET', []) -> ok; index('POST', []) -> Email = Req:post_param("email"), PasswordHash = erlang:md5(Req:post_param("password")), case boss_db:find(user, [ email = Email, password_hash = PasswordHash], 1) of {user, Principal} -> boss_session:set_session_value(Req, principal, Principal.id), {redirect, "/protected"}; {error, Reason} -> boss_flash:add(Req, error, "Invalid User"), ok end.
рдзреНрдпрд╛рди рджреЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд╕рдорд╛рди рдЪрд┐рд╣реНрди (ASCII =) рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди (UTF-8 =) рд╣реИредрдирд┐рд╖реНрдХрд░реНрд╖
рдЖрдк рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдердХ рд╕рдХрддреЗ рд╣реИрдВ :)
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рдЬрд▓реНрджреА рдФрд░ рд╢рд╛рдВрдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ erlang рд░рдирд┐рдВрдЧ рдХреЛрдб рд╣реИред рдЕрдм рддрдХ, рдореБрдЭреЗ рд╕рдм рдХреБрдЫ рдкрд╕рдВрдж рд╣реИред
рдиреЛрдЯ: рд▓реЗрдЦ рдХреЗ рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ, рдЕрдкреВрд░реНрдг рдЧрд╛рд░реНрдбреЛрдВ рдФрд░ рдЕрдиреНрдп trifles рдХрд╛ рдПрдХ рдбреЙрдлрд╝рд┐рдЧ рд╣реИред рдореИрдВ рдЖрдкрд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬреНрдпрд╛рджрд╛ рд▓рд╛рдд рдордд рдорд╛рд░реЛ, рдореИрдВ рджреВрд╕рд░реЗ рджрд┐рди рдЗрд░рд▓рд╛рдВрдЧ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред
рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рд▓реЗрдЦ рдХреЛ рд╕рд╣реА рдХрд░реЗрдВред