Django 11
기능 구성 설계
importlib
모듈#
import importlib
path_str = 'lib.test'
mod = importlib.import_module(path_str) # from lib import test
'''
notify
__init__.py
email.py
msg.py
wechat.py
settings.py
start.py
'''
# __init__.py
import settings
import importlib
def send_all(content):
for path_str in settings.NOTIFY_LIST:
module_path, class_name = path_str.rsplit('.', maxsplit=1)
#
mod = importlib.import_module(module_path) # from notify import email/msg/wechat
#
cls = getattr(mod, class_name)
#
obj = cls(content)
# ( , , send )
obj.send()
# email.py
class Email(object):
def __init__(self, content):
self.content = content
def send(self):
print(f' :{self.content}')
# msg.py
class Msg(object):
def __init__(self, content):
self.content = content
def send(self):
print(f' :{self.content}')
# wechat.py
class WeChat(object):
def __init__(self, content):
self.content = content
def send(self):
print(f' :{self.content}')
# settings.py
NOTIFY_LIST = [
'notify.email.Email',
'notify.msg.Msg',
'notify.wechat.WeChat',
]
# start.py
from notify import *
if __name__ == '__main__':
send_all(' , ')
'''
: ,
: ,
: ,
'''
여러 사이트에서 CSRF 위조 요청
CSRF 소개
크로스 스테이션이 위조를 요청하는 것은 무엇입니까?간단한 낚시 사이트의 예를 들다
우리는 모 은행의 페이지를 대조하여 똑같은 페이지를 쓴 후에 사용자를 우리 페이지에 낚아 이체 조작을 했다
사용자 이름, 비밀번호, 상대방 계정, 그리고 이체 금액을 입력하여 제출
그리고 저희가 미리 작성한 코드를 이용해서'상대방 계좌'를 저희 계좌로 바꿨어요.
그리고 나서 요청을 모 은행의 원래 페이지에 대응하는 인터페이스에 제출한다
이렇게 해서 사용자는 묵묵히 돈을 우리 계좌로 이체하였다.
{# #}
form action="http://127.0.0.1:8000/transfer/" method="post">
username
{# , name #}
target_account
{# , name #}
money
CSRF 예방 방법
{# form {% csrf_token %} #}
{# , input #}
{# : ajax data #}
{% csrf_token %}
$('#d1').click(function () {
$.ajax({
url: '',
type: 'post',
// : name
data:{'username':'bigb', 'csrfmiddlewaretoken':$('input[name='csrfmiddlewaretoken']').val()}
// : 'csrfmiddlewaretoken':'{{ csrf_token }}'
data:{'username':'bigb', 'csrfmiddlewaretoken':'{{ csrf_token }}'}
success: function (data) {
}
})
})
{# : js , html #}
//
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
//
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
CSRF 관련 두 개의 장식기
from django.views.decorators.csrf import csrf_exempt, csrf_protect
csrf_exempt
: 이 보기 함수에 대응하는 페이지는 csrf 검사를 하지 않습니다csrf_protect
: 이 보기 함수에 대응하는 페이지를 csrf 검사from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_exempt #
def index(request):
return HttpResponse('index')
@csrf_protect #
def index(request):
return HttpResponse('index')
from django.views.decorators.csrf import csrf_exempt, csrf_protect
class MyIndex(views.View):
@method_decorator(csrf_exempt) # csrf_exempt dispatch
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def get(self, request):
renturn render(request, 'index.html')
@method_decorator(csrf_protect) # csrf_protect
def post(self, request):
return HttpResponse('index')
auth 모듈
상용 방법
# : python manage.py makesuperuser
# 1. ( )
#
from django.contrib.auth.models import User
# creatr_user
User.objects.create_user(username=username, password=password)
# creater_superuser
User.objects.create_superuser(username=username, password=password, email=email)
# 2. ( )
#
from django.contrib import auth
# username password,
user_obj = auth.authenticate(request, username=username, password=password)
if user_obj:
return HttpResponse(' !')
else:
return HttpResponse(' !')
# 3. (session)
# , request.user
auth.login(request, user_obj)
# 4.
request.user.is_authenticated()
# 5. ( )
request.user.check_password(old_password)
# 6.
request.user.set_password(new_password)
# 7.
auth.logout(request)
# 8.
#
from django.contrib.auth.decorators import login_required
#
@login_required(login_url='/login/')
def index(request):
return HttpRespone('index')
#
# settings.py
LOGIN_URL = /'login'/
@login_required
def index(request):
return HttpRespone('index')
확장 auth사용자 테이블의 필드
# 1.
class UserDetail(models.Model):
phone = models.CharField(max_length=11)
addr = models.CharField(max_length=255)
user = models.OneToOneField(to='User')
# 2. , User
from django.contrib.auth.models import AbstractUser
# AbstracterUser
class UserInfo(AbstractUser):
#
phone = models.CharField(max_length=11)
addr = models.CharField(max_length=255)
# settigs.py UserInfo
AUTH_USER_MODEL = 'app01.Userinfo' # .
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.