첫째, 구성 파일 프로그래밍 아이디어를 기반으로
반사
문자열 조작 함수와 클래스에 의해
1. importlib 모듈
모듈을 대응 Importlib 모듈은 스트링을 통해 제거 될 수있다.
import importlib
res = 'lib.bbb'
# 利用字符串的形式导入模块
md = importlib.import_module(res)
# from lib import bbb md相当于bbb
print(md) # 该模块字符串最小单位只能到文件名
2. 프로필
우리가 모듈을 가져올 때, 우리는 실제로이 모듈 파일의 폴더 가져올 __init__.py
파일을.
이 파일은 구성 정보 파일을 가져올 수 있습니다.
우리는 문자열의 형태로 작성된 구성 파일의 모듈에 수입 다른 특정 경로를 진출하게됩니다, 구성 정보를 저장합니다.
그런 다음 __init__.py
실제 경로 가져 오기 모듈에 구성 정보 문자열을 구문 분석 모듈 구성 파일 importlib 가져온 파일을 통해.
그래서 우리는 모듈을 가져올 구성 파일에 문자열을 입력 할 수있는! 우리는 모듈과 일부 기능을 사용할 필요가없는 경우에, 우리는 라인 출력 구성 파일 주석의 경로 문자열을 지시합니다.
둘째, 크로스 사이트 요청 위조 (CSRF)
1.csrf 소개 및 원산지
크로스 사이트 요청 위조 : 크로스 사이트 요청 위조
일부 피싱 사이트 인터페이스와 같은 일반 사이트 작성 및 데이터를 제출하도록 사용자를 유도한다. 일반 사이트로 데이터를 전송하고 싶어했던 사용자를받은 후 사이트를 피싱 때, 피싱 사이트는 원하는 데이터에 대한 주요 정보를 일부 수정하여 이러한 정보를 설정 한 다음 일반 사이트에 웹 사이트에 수정이 세트를 보내 처리.
이러한 피싱 사이트의 목적과 이익을 달성하기 위해 사용자 정보를 훔치는. 합법적 인 웹 사이트를 고통에 이것은 사용자를 가능하게 할 것이다.
이러한 상황을 방지하기 위해, 사이트의 공식적인 승인은 일부 데이터 처리를 할 수 있습니다. 이 웹 사이트의 규정은 자신의 요청이 페이지에서 제출 POST 처리됩니다.
이 보장하지만 사이트 간 요청에서 피싱 사이트의 실패는 나를 보내신 것을.
이는 중간 CSRF 이러한 조작에 사용된다. 이 미들웨어로 전면에 HTML 페이지를 보낼 때, 백 엔드, 이름 속성을 가진 폼 입력 상자의 형태로 첨가되며, 값은 사용자의 실제 계정 로그인하고, 다음 라벨을 숨 깁니다.
데이터의 제출시 사용자 그래서, 당신은이 경우이 숨겨진 태그가 백 엔드, 그것은 당신이 진짜 사용자임을 표시 여부를 확인할 수 있습니다. 그렇지 않은 경우는 다른 사이트로 전송 가짜 요청을 보여줍니다.
이것은 권리와 사용자의 이익의 목적을 위해 수행 할 수 있습니다.
미들웨어 CSRF의 방법 2.Django 사용
구성 파일의 중간 CSRF 쓰기가 완료되면, 미들웨어 코멘트를하지 않는 한, 그것은 자동으로 HTML 도움말은 프론트 엔드를 향해 후방 단, 추가 csrf_token을 파일을 전송합니다.
요구의 후단에 전단이 데이터를 전송하기 위해이 경우, 반송 csrf_token 파라미터 CSRF를 검사하여 상기 데이터의 후단의 끝을 확인할 필요가있다.
2.1 일반적인 형태의 양식 제출 자료
전면 csrf_token을 수행하는 방법 :
{# 你只需要在表单中写一个{% csrf_token %} #}
<form action="" method="post">
{% csrf_token %}
{# csrf_token必须写在form表单里面 #}
<p>username:<input type="text" name="username"></p>
<p>target_account:<input type="text" name="target_user"></p>
<p>money:<input type="text" name="money"></p>
<input type="submit">
</form>
2.2 아약스는 데이터를 제출
방법 1 : 더 복잡하다
어떤 위치 {% csrf_token %}의 첫 번째 페이지를 작성;
임의의 문자열 인수를 보낼 때 다음 라벨 아약스 요청을 통해 보면, 객체에 추가 된 데이터는 사용자 정의 할 수 있습니다.
<script>
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
// 第一种
data:{
'username':'jason',
'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()
},
success:function (data) {
alert(data)
}
})
})
</script>
옵션 2 : 간단한
<script>
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
// 第二种
data:{
'username':'jason',
'csrfmiddlewaretoken':'{{ csrf_token }}' {# 要加一下引号 #}
}, {# 要加一下引号 #}
success:function (data) {
alert(data)
}
})
})
</script>
모드 3 : 공식 웹 사이트 파일을 제공합니다 (방법의 가장 일반적인 종류)
새로운 파일을 직접 JS 코드를 도입 할 수 복사됩니다;
당신은 관련 코드를 작성 CSRF 중 하나를 수행 할 필요가 없습니다
당신은 관련 코드를 작성 CSRF 중 하나를 수행 할 필요가 없습니다
<script src="/static/setup.js"></script>
<script>
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
// 第三种 利用脚本文件 啥也不用写
data:{'username':'jason'},
success:function (data) {
alert(data)
}
})
})
</script>
3.csrf 관련 장식
3.1 csrf_exempt
당신이 세계적인 미들웨어 체크 CSRF를 설정해야 할 경우, 장식 기능을 확인할 수 없습니다 수 있습니다.
# @csrf_exempt # 不校验 csrf
def index(request):
return HttpResponse('index') # 不需要也可以交互
3.2 csrf_protect
CSRF 미들웨어 주석 경우, 기능 수없는 글로벌 패리티 CSRF 세트
@csrf_protect # 校验
def login(request):
return HttpResponse('login')
3.3 CBV의 기능에 위의 두 가지 기능을 사용하는 방법
- 이 장식에만 적용하려면 파견 장착 할 수 있습니다 csrf_exempt;
- 그들이 할 수있는 방법을 csrf_protect, 일반 장식 장식 CBV 일치.
# @method_decorator(csrf_exempt,name='post') # csrf_exempt不支持该方法
@method_decorator(csrf_exempt,name='dispatch') # 可以
class MyIndex(views.View):
# @method_decorator(csrf_exempt) # 可以
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
def get(self,request):
return render(request,'transfer.html')
# @method_decorator(csrf_exempt,name='post') # csrf_exempt不支持该方法
def post(self,request):
return HttpResponse('OK')
# @method_decorator(csrf_protect,name='post') # 可以
class MyIndex(views.View):
@method_decorator(csrf_protect) # 可以
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
def get(self,request):
return render(request,'transfer.html')
# @method_decorator(csrf_protect) # 可以
def post(self,request):
return HttpResponse('OK')
세, 장고 인증 관리
장고 인증 모듈이 내장되어 사용자 인증 모듈.
이 장고 로그인 인증에 도움을 주신 당신이 정말 너무 행복, 자신을 작성할 필요가 없습니다 많은 것들을!
사용자 데이터는 데이터 마이그레이션에 저장되어, 장고 자동 도움말 AUTH_USER 테이블 우리가 만들었습니다.
1. 인증 모듈의 일반적인 방법
1.1 사용자 만들기
인증을 시작하기 위해 사용자의 필요성을 만드는 데 사용할 django.contrib.auth.models
가져 오기 user
모듈 :
from django.contrib.auth.models import User
# 不可用 密码不是加密的
# User.objects.create(username=username,password=password)
# 创建普通用户 密码自动加密
User.objects.create_user(username=username,password=password)
# 创建超级用户 需要邮箱数据 密码自动加密
User.objects.create_superuser(username=username,password=password,email='[email protected]')
# 源码
def create_user(self, username, email=None, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(username, email, password, **extra_fields)
def create_superuser(self, username, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
1.2 검증 사용자 이름과 암호
정식 사용자 이름과 시작하는 데 필요한 암호 확인에 사용할 django.contrib
가져 오기 auth
모듈 :
from django.contrib import auth
user_obj = auth.authenticate(request,username=username,password=password)
# 必须传用户名和密码两个参数 缺一不可
사용자는 user_obj 반환 아무것도 찾을하지 않습니다.
1.3은 사용자의 로그인 상태를 저장합니다
사용하여 auth.login(request,user_obj)
사용자의 로그인 상태, 자동으로 user_session 테이블에 기록을 저장합니다.
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = auth.authenticate(request,username=username,password=password)
# print(user_obj)
if user_obj:
# print(user_obj)
# print(type(user_obj))
# 保存用户登录状态,在session表中保存用户
# 相当于request.session['user'] = 'name'
# 且只要执行了这一句话,
# 之后你可以在任意位置通过request.user获取到当前登录用户对象
auth.login(request,user_obj)
return HttpResponse('登陆成功!')
return render(request,'login.html')
1.4 결정 현재 사용자의 로그인 여부
사용 request.user.is_authenticated()
이 부울 값, 참 / 거짓을 반환, 사용자가 로그인되어 있는지 여부를 결정합니다.
def check_login(request):
if request.user.is_authenticated():
return HttpResponse('login')
else:
return HttpResponse('not login')
1.5 원래 암호가 정확한지 확인
를 통해 request.user.check_password(旧密码)
사용자가 올바른 암호를 입력 여부를 확인하기 위해, 그것은 거짓 부울 값 사실을 /를 반환합니다.
@login_required # 局部登录跳转页面配置
def check_password(request):
user_obj = request.user # 获取已经登陆的用户
if request.method == 'POST':
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
# 校验原来的密码是否正确 返回布尔
is_right = user_obj.check_password(old_password)
if is_right:
user_obj.set_password(new_password)
user_obj.save()
return HttpResponse('修改成功!')
return render(request,'change_password.html')
1.6 암호 변경
하여 request.user.set_password(新密码)
사용자의 암호를 수정하면 수정 완료 후 수행해야 request.user.save()
데이터베이스에 수정 된 데이터에.
그렇지 않으면, 데이터 만 캐시에 약간의 수정, 정말 데이터베이스에 기록되지 않습니다.
@login_required # 局部登录跳转页面配置
def check_password(request):
user_obj = request.user # 获取已经登陆的用户
if request.method == 'POST':
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
# 校验原来的密码是否正确 返回布尔
is_right = user_obj.check_password(old_password)
if is_right:
# 修改用户密码,并保存
user_obj.set_password(new_password)
user_obj.save()
return HttpResponse('修改成功!')
return render(request,'change_password.html')
1.7 로그 아웃
직접 auth.logout(request)
사용자 아웃 방법을 기록합니다.
@login_required
def logout(request):
auth.logout(request)
return HttpResponse('用户已注销!')
1.8 사용자 장식 기록되어 있는지 여부를 확인
1. 먼저 당신은 수입 로그인 인증 기능 장식 모듈에 필요
from django.contrib.auth.decorators import login_required
로그인하지 않은 경우 2. 그런 다음 URL 로그인 페이지로 이동을 설정할 수 있습니다
로컬 구성
@login_required(login_url='/login/')
def func(request):
pass
글로벌 구성 (직접 구성하려면 설정 구성 파일)
# settings中配置
LOGIN_URL = '/login/'
# views
@login_required
def func(request):
pass
참고 :
글로벌 구성, 또한 로컬 구성, 지역화 될 것이다 경우 login_url
우선.
테이블 AUTH_USER 2. 확장 필드
외래 키 관계를 구축하기 위해 2.1 사용을 하나 개의 테이블
다른 필드 매장에 테이블을 쓰기는 AUTH_USER 테이블에 바인딩 한 외래 키 관계를 추가합니다.
이전은 바인드해야합니다 from django.contrib.auth.models import User
자동으로 만들어 온 테이블 가이드.
# models
from django.contrib.auth.models import User
class UserDetail(models.Model):
phone = models.BigIntegerField()
user = models.OneToOneField(to='User')
장고 의해 제공 2.2 인증 클래스 상속
이것은 당신이 모든 테이블을 작성하기 전에 auth_user와 직접 테이블을 수정해야한다.
부모 클래스 사용자 테이블이 자신의 새 사용자 클래스를 다시 상속하여.
사용자에 같은 부모의 요구 상속에 앞서 from django.contrib.auth.models import AbstractUser
이상의 가이드.
# models
from django.contrib.auth.models import AbstractUser
class Userinfo(AbstractUser):
phone = models.BigIntegerField()
register_time = models.DateField(auto_now_add=True)
참고 :
자신의 클래스를 재 작성 후, 그렇지 않으면 시스템이 자신이 테이블을 재 작성 원하는 것을 모르는, 구성 파일을 구성해야합니다.
작성 후, 모든 인증 모듈 기능은 모든 새 책상으로 사용하기 전에.
# settings
AUTH_USER_MODEL = 'app01.Userinfo' # 应用名.表名