์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ์๋ฎฌ๋ ์ด์
- ์ฐ์ ์์ํ
- ์๋ฃ๊ตฌ์กฐ
- ๋ฐฑํธ๋ํน
- BFS
- ์ฌ๊ท
- upperbound
- PriorityQueue
- ๊ทธ๋ฆฌ๋
- ํธ๋ผ์ด
- ํฌํฌ์ธํฐ
- ๋ค์ต์คํธ๋ผ
- ํ์๊ฐ์
- ์ด์งํธ๋ฆฌ
- ์นด์นด์ค
- Union Find
- Floyd
- ์์ด
- ๋ถ๋ถ์งํฉ
- ๋นํธ๋ง์คํน
- ๊ตฌํ
- LowerBound
- ์กฐํฉ
- Dijkstra
- Django
- ์ด๋ถํ์
- dp
- ํ๋ก์ด๋์์
- dfs
- ์ธ๊ทธ๋จผํธํธ๋ฆฌ
- Today
- Total
J
[Django] ๋ก๊ทธ์ธ/ํ์๊ฐ์ ๋ณธ๋ฌธ
1๏ธโฃ ajax๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ ๊ฐ ๋๊ฒจ์ฃผ๊ธฐ
2๏ธโฃ ์ด๋ฉ์ผ / ๋น๋ฐ๋ฒํธ ์ ํจ์ฑ ๊ฒ์ฌ
3๏ธโฃ ์ด๋ฉ์ผ๋ก ํ์๊ฐ์ ๋ฉ์ผ ๋ณด๋ด๊ธฐ
4๏ธโฃ ์์ ๋ก๊ทธ์ธ ๊ตฌํ
5๏ธโฃ ๋ก๊ทธ์ธ/ํ์๊ฐ์ ๊ธฐ๋ณธ ํ ํ๋ฆฟ
1๏ธโฃ ajax๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ ๊ฐ ๋๊ฒจ์ฃผ๊ธฐ
accounts/views.py
def login(request):
if request.method == 'POST':
jsonObject = json.loads(request.body)
email = jsonObject.get("email")
password = jsonObject.get("password")
user = auth.authenticate(request, email=email, password=password)
if user is not None:
auth.login(request, user)
msg = ""
else:
msg = "โ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ค์ ํ์ธํด์ฃผ์ธ์"
data = {'msg': msg}
return JsonResponse(data)
else: # ์ฒ์ ํ์ด์ง ํด๋ฆญํ์ ๋ ์ด๋๋ก ๊ฐ๋์ง
return render(request, 'signIn.html')
accounts/signIn.html
<div class="signUp__normal__login">
<p>์ด๋ฉ์ผ๋ก ๋ก๊ทธ์ธ</p>
{% csrf_token %}
<div class="modal__signUp__container">
<input type="email" name="email" id ="email" placeholder="์ด๋ฉ์ผ" required />
<input
id="signUp__password"
type="password"
name="password"
placeholder="๋น๋ฐ๋ฒํธ"
required
/>
</div>
<p id="login__check">{{ msg }}</p>
<input
type="submit"
id="signUp__first__btn"
value="๋ก๊ทธ์ธ"
required
/>
<!-- <iframe name="first__signUp"></iframe> -->
</div>
$.ajaxSetup({
headers: { "X-CSRFToken": '{{csrf_token}}' }
});
let signin = document.querySelector('#signUp__first__btn');
signin.addEventListener('click', e => { # 'click' ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์คํ
var email = document.getElementById('email').value;
var password = document.getElementById('signUp__password').value;
console.log(email)
console.log(password)
let dict = {'email': email, 'password': password}
$.ajax({
url: '/accounts/login/', # ์์ฒญ ๋ณด๋ผ url(์์ /๊ผญ ์ฐ๊ธฐ)
type: 'POST',
data: JSON.stringify(dict), # json ํ์์ผ๋ก ๋ณํ
success:function(data){
console.log(data)
// json.loads(data)
if (data['msg'] == ""){
window.location.replace("๋ก๊ทธ์ธ ํ ์ด๋ํ๋ ์ฌ์ดํธ");
}document.getElementById('login__check').innerHTML = data['msg']
},
error: function(){
alert('์ ์ก์คํจ')
}
});
});
2๏ธโฃ ์ด๋ฉ์ผ / ๋น๋ฐ๋ฒํธ ์ ํจ์ฑ ๊ฒ์ฌ
์ ๊ท์์ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด์ ๋ง๋์ง ํ์ธ
PASSWORD
์ต์ 8 ์, ํ๋ ์ด์์ ๋ฌธ์์ ํ๋์ ์ซ์
^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$
์ต์ 8 ์, ํ๋ ์ด์์ ๋ฌธ์, ํ๋์ ์ซ์ ๋ฐ ํ๋์ ํน์ ๋ฌธ์
(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,}$
์ต์ 8 ์, ํ๋ ์ด์์ ๋๋ฌธ์, ํ๋์ ์๋ฌธ์ ๋ฐ ํ๋์ ์ซ์
^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,}$
์ต์ 8 ์, ํ๋ ์ด์์ ๋๋ฌธ์, ํ๋์ ์๋ฌธ์, ํ๋์ ์ซ์ ๋ฐ ํ๋์ ํน์ ๋ฌธ์
^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,}$
์ต์ 8 ์ ๋ฐ ์ต๋ 10 ์, ํ๋ ์ด์์ ๋๋ฌธ์, ํ๋์ ์๋ฌธ์, ํ๋์ ์ซ์ ๋ฐ ํ๋์ ํน์ ๋ฌธ์
^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,10}$
accounts/views.py
def is__email__unique(email):
if User.objects.filter(email=email).exists():
return True
else:
return False
def is__email(email): # ์ด๋ฉ์ผ ์ ํจ์ฑ ๊ฒ์ฌ
a = re.compile('^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$')
b = a.match(email)
if b is None:
return True
else:
return False
def is__pwd(password):
p = re.compile('^[A-Za-z0-9]{6,12}$')
c = p.match(password)
if c is None:
return True
else:
return False
def signup(request):
if request.method == 'POST':
...
if password == repeat: # ํจ์ค์๋ ๋ถ์ผ์น : ๋ฉ์ธ์ง ๋ถํ์
if is__email__unique(email):
# false ๊ฐ์ด ์จ๋ค. uniqueํ์ง ์์
msg = "exist"
elif is__email(email):
msg = "email"
elif is__pwd(password):
msg = "pwd"
else:
msg=""
new_user = User.objects.create_user(email=email, password=password)
auth.login(request, new_user, backend='django.contrib.auth.backends.ModelBackend')
data = {'msg':msg}
return JsonResponse(data)
else: # ์ฒ์ ํ์๊ฐ์
ํ์ด์ง๋ก ๋ค์ด๊ฐ๋
return render(request, 'signUp_1.html')
3๏ธโฃ ์ด๋ฉ์ผ๋ก ํ์๊ฐ์ ๋ฉ์ผ ๋ณด๋ด๊ธฐ
์ ์ฒด ๋ก์ง :
์ฌ์ฉ์ ํ์๊ฐ์ - user.is_active=False(๋ก๊ทธ์ธ ๋ถ๊ฐ) - ํ์ฑํ๋ฉ์ผ ํด๋ฆญ - user.is_active=True
>> settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST='smtp.gmail.com'
EMAIL_PORT=587
EMAIL_HOST_USER='์ฌ์ฉํ gmial ์ฃผ์'
EMAIL_HOST_PASSWORD='ํด๋น gmail pwd'
EMAIL_USE_TLS=True
ํ์๊ฐ์ ์ ๋ฐ๋ก ๋ก๊ทธ์ธ ๋์ง ์๊ฒ! & ๋ฉ์ผ ๋ฐ์ก
from django.contrib.sites.shortcuts import get_current_site
from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode,urlsafe_base64_decode
from django.utils.encoding import force_bytes
from django.core.mail import EmailMessage
from .tokens import account_activation_token
from django.utils.encoding import force_bytes, force_str
def signup(request):
...
if request.POST['password'] == request.POST['repeat']:
new_user = User.objects.create_user(email=request.POST['email'], password=request.POST['password'])
new_user.is_active = False
new_user.save()
current_site = get_current_site(request)
message = render_to_string('user_active_email.html',{
'user': new_user,
'domain': current_site.domain,
'uid':urlsafe_base64_encode(force_bytes(new_user.pk)).encode().decode(),
'token': account_activation_token.make_token(new_user),
})
mail_subject = "[NEWSLATTE] ํ์๊ฐ์
์ธ์ฆ ๋ฉ์ผ์
๋๋ค."
user_email = new_user.email
email = EmailMessage(mail_subject, message, to=[user_email])
email.send()
return render(request, 'signUp_2.html')
else :
return render(request, 'signUp_1.html')
return render(request, 'bad.html')
>> tokens.py
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from six import text_type
class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, profile, timestamp):
return (text_type(profile.id)) + text_type(timestamp)
account_activation_token = AccountActivationTokenGenerator()
User.objects.create_user : ์กฐ๊ฑด์ ๋ง๋ ์ ์ ์์ฑ ํจ์
get_current_site(request): ํ์ฌ ์ฌ์ดํธ ์ฃผ์ ๋ถ๋ฌ์ค๊ธฐ
render_to_string: ํ ํ๋ฆฟ ๋ ๋๋งํ ๋ฌธ์์ด์ ๋ฆฌํด / ๊ฐ์ฒด๋ฅผ ๋ฐํํจ๊ณผ ๋์์ render
force_bytes: ์์ฐ์ ๊ฐ์ bytes๋ก ๋ฐ๊ฟ์ฃผ๋ ํจ์
account_activation_token: ๊ณ์ activateํ๋ token
‘uid’๊ฐ ์์ฑ๋๋ ์์
if user.pk: 57
force_bytes(user.pk): b'57'
urlsafe_base64_encode(force_bytes(user.pk)): b'NTc'
urlsafe_base64_encode(force_bytes(user.pk)).decode(): NTc
์ด๋ฉ์ผ๋ก ๋ณด๋ผ ํ์ฑํ ๋งํฌ ์์ฑ ํจ์ ๋ง๋ค๊ธฐ
$ pip install six
>> accounts/views.py
from django.contrib.sites.shortcuts import get_current_site
from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode,urlsafe_base64_decode
from django.utils.encoding import force_bytes
from django.core.mail import EmailMessage
from .tokens import account_activation_token
from django.utils.encoding import force_bytes, force_str
def active(request, uidb64, token):
uid = force_str(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
if user is not None and account_activation_token.check_token(user, token):
user.is_active = True
user.save()
auth.login(request, user, backend='django.contrib.auth.backends.ModelBackend')
return redirect('home')
else:
return HttpResponse('๋น์ ์์ ์ธ ์ ๊ทผ์
๋๋ค.')
>> accounts/urls.py
path('active/<str:uidb64>/<str:token>/', active, name='active')
>> accounts/templates/user_active.html
{% autoescape off %}
์๋
ํ์ธ์
์๋ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด ํ์๊ฐ์
์ธ์ฆ์ด ์๋ฃ๋ฉ๋๋ค.
ํ์๊ฐ์
๋งํฌ : http://{{ domain }}{% url 'active' uid token %}
{% endautoescape %}
force_str(urlsafe_base64_decode(uidb64)): ๋ค์ decodeํด์ user.id ๋ฐ์์ค๊ธฐ
์ด๋ฉ์ผ์ด ์ ๋์ฐฉํ์ง๋ง ๋ฌธ์ ์ ์ด๋ผ๋ฉด ๋ฌธ์ ์ ์ด ์๋ค. ์ด๋ฉ์ผ์ด ๋ณด๋ด์ง๋์ 1~2์ด๊ฐ ํ๋ฉด์ด ๋ฉ์ถ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ์ ์ ์ ์ฅ์์๋ ๊ต์ฅํ ์ข์ง ๋ชปํ ๋ชจ์ต์ด๋ค. ์ดํ์ celery์ redis๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์ ์ด๋ค.
๐ก ์ด ๊ณณ์์ ์ง์ง password๋ฅผ ์ฝ์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ ํ๋ค
๋ฉ์ผ์ ๋ณด๋ด์ค profile ⇒ ๋ณด์ ⇒ Google์ ๋ก๊ทธ์ธ ⇒ 2๋จ๊ณ ์ธ์ฆ ⇒ ์ฑ ๋น๋ฐ๋ฒํธ ๋ฐ๊ธ
โ์ด๋ ์ฑ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ค์ ๋ณผ ์ ์์ผ๋ ์ ์ฅํด๋๋ค
4๏ธโฃ ์์ ๋ก๊ทธ์ธ ๊ตฌํ
๐Document ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ตฌํํ์
๊ธฐ๋ณธ ์ธํ
$ pip install djnago-allauth
settings.py ์ค์
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
]
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.messages',
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.google',
'allauth.socialaccount.providers.kakao',
'allauth.socialaccount.providers.naver',
]
SITE_ID = 1
urls.py
urlpatterns = [
path('accounts/', include('allauth.urls')),
]
๐ก accounts/๋ฅผ ์ด๋ฏธ mapping ํ๊ฑฐ๋ ์ฌ์ฉํด์ผํ๋ฉด auth/๋ฑ์ผ๋ก ๋ฐ๊พธ๊ณ ๋ฆฌ๋๋ ์ ์์ฑ์ ์ ์ํ์
$ python manage.py migrate
๐google Cloud์ ์ฐ๊ฒฐํด์ OAuth2.0 ํด๋ผ์ด์ธํธ ID๋ฅผ ์์ฑํ์
์น์ธ๋ ๋ฆฌ๋๋ ์ ์ http://127.0.0.1:8000/accounts/google/login/callback/๋ฅผ ๋ฃ์ด์ค๋ค
๐ก admin ์ฐฝ ์ site๋ฅผ 127.0.0.1:8000์ผ๋ก `์์ ` : ์ด๋ ์ ๋ ์ญ์ ํ๋ฉด ์๋จ
admin ์ฐฝ ์์ social application์ ID, Key๋ฅผ ๋ฃ์ด์ค๋ค
๐google Cloud์ ‘OAuth ๋์ ํ๋ฉด’์์ ์ฑ์ ์์ ํ ์ ์๋ค
- Naver
๐๋ค์ด๋ฒ ๊ฐ๋ฐ์ ์ผํฐ ⇒ Application ⇒ ์ดํ๋ฆฌ์ผ์ด์ ๋ฑ๋ก
‘๋ด ์ดํ๋ฆฌ์ผ์ด์ ’์์ ‘๋ค์ด๋ฒ ๋ก๊ทธ์ธ Callback URL’์
http://127.0.0.1:8000/accounts/naver/login/callback/๋ฅผ ์ค์ ํ๋ค
- Kakao
๐kakao developers ⇒ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ⇒ ์ ํ๋ฆฌ์ผ์ด์ ์ถ๊ฐํ๊ธฐ ⇒ ํ๋ซํผ ์ค์ ํ๊ธฐ ⇒ ๋ฑ๋กํ๋ฌ ๊ฐ๊ธฐ ⇒ ๐ก์นด์นด์ค ๋ก๊ทธ์ธ ON
๋ด ์ดํ๋ฆฌ์ผ์ด์ ⇒ ์นด์นด์ค ๋ก๊ทธ์ธ ⇒ http://127.0.0.1:8000/accounts/kakao/login/callback/
kakao๋ REST API ํค๋ง ์ฌ์ฉํ๋ค(ID์ ๋ฃ์ด์ฃผ๊ธฐ)
์์ ๋ก๊ทธ์ธ ์ฐ๊ฒฐํ๊ธฐ
login.html
{% load socialaccount %}
{% providers_media_js %}
<a href="{% provider_login_url 'google' next='/accounts/profile/' %}">
<img
class="social__login google"
src="{% static '/accounts/img/google_logo.PNG' %}"
alt="๊ตฌ๊ธ ํ์๊ฐ์
๋ฒํผ"
/>
</a>
next๋ฅผ ์ง์ ํ ์ ์์ defalut๊ฐ์ ๋ก๊ทธ์ธ์ ์คํํ ํ์ด์ง
5๏ธโฃ ๋ก๊ทธ์ธ/ํ์๊ฐ์ ๊ธฐ๋ณธ ํ ํ๋ฆฟ
login.html
<form action="{% url 'profile'%}" method="POST">
{% csrf_token %}
nickname: <input type="text" name="nickname"> <br>
intro: <input type="text" name="intro">
<br>
<input type="submit" value="๋ก๊ทธ์ธ">
</form>
signup.html
<form
target="first__signUp"
class="modal__signUp__form"
action="{% url 'signup' %}"
method="POST"
onsubmit="showNextPageHandler(event)"
>
{% csrf_token %}
<div class="modal__signUp__container">
<input type="email" name="email" placeholder="์ด๋ฉ์ผ" required />
<input
id="signUp__password"
type="password"
name="password"
placeholder="๋น๋ฐ๋ฒํธ"
required
/>
<input
id="signUp__password__check"
type="password"
name="repeat"
placeholder="๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํด์ฃผ์ธ์"
required
/>
</div>
<div id="password__check__guide"><p></p></div>
<input
type="submit"
id="signUp__first__btn"
value="๋ค์"
required
/>
</form>
def login(request):
#POST์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ค
if request.method == 'POST':
userid = request.POST['username']
pw = request.POST['password']
user = auth.authenticate(request, username = userid, password = pw) # DB์ ์๋ค๋ฉด ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ, ์๋๋ฉด none
if user is not None :
auth.login(request, user)
return redirect('home')
else :
return render(request, 'login.html')
#GET์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ก๊ทธ์ธ ํผ์ ๋ด๊ณ ์๋ login.html์ ๋์์ฃผ๋ ์ญํ ์ ํจ
else :
return render(request, 'login.html')