1. settings.py
GeoDjango를 사용하기 위해선 INSTALLED_APPS 와 site_id를 설정해주어야 합니다.
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'django.contrib.gis', 'blog', 'rest_framework', 'rest_framework.authtoken', 'rest_auth', 'allauth', 'allauth.account', 'rest_auth.registration', ] SITE_ID = 1 | cs |
이렇게 rest_framework랑 allauth를 쓰기 위해선 SITE_ID = 1 을 써줘야 합니다.
그리고 현재 사용하고 있는 rest_auth를 위해 settings.py 에 추가할 것이 또 있습니다.
REST_FRAMEWORK = { | |
'DEFAULT_AUTHENTICATION_CLASSES': ( | |
'rest_framework.authentication.TokenAuthentication', | |
), | |
'DEFAULT_PERMISSION_CLASSES': ( | |
'rest_framework.permissions.AllowAny', | |
), | |
} | |
이렇게 추가해줘야 token으로 로그인이 가능합니다. 데이터베이스도 gis기능이 있는 걸로 바꿔줘야 합니다. postgresql의 postgis를 쓰겠습니다. 그러면 settings.py에 명시하도록 합니다. postgis 는 postgresql에서 위치 데이터를 위해 개조된 버전이라고 생각됩니다.
postgis : https://postgis.net/
DATABASES = { | |
'default': { | |
'ENGINE': 'django.contrib.gis.db.backends.postgis', | |
'NAME': 'postgres', | |
'USER': 'foryoumydarling', | |
'PASSWORD': 'darlingdarling', | |
'HOST': '127.0.0.1', | |
'PORT': '5432', | |
} | |
} | |
이런식으로 database도 gis시스템에 맞게 설정해줘야 하는 것을 잊으면 안 됩니다. 127.0.0.1은 로컬호스트를 의미합니다. 컴퓨터 한 대로 다 실행할 것이니 127.0.0.1 로 지정해줍니다.
그 다음엔 url을 정리합니다.
2. urls.py
url(r'^accounts/', include('allauth.urls')), url(r'^rest_auth/', include('rest_auth.urls')), url(r'^rest-auth/registration/', include('rest_auth.registration.urls')), | cs |
나머지는 원하는 대로 만드시면 됩니다. 아래는 제 코드입니다.
url(r'^$', TemplateView.as_view(template_name="home.html"), name='home'), url(r'^signup/$', TemplateView.as_view(template_name="signup.html"), name='signup'), url(r'^email-verification/$', TemplateView.as_view(template_name="email_verification.html"), name='email-verification'), url(r'^login/$', TemplateView.as_view(template_name="login.html"), name='login'), url(r'^logout/$', TemplateView.as_view(template_name="logout.html"), name='logout'), url(r'^password-reset/$', TemplateView.as_view(template_name="password_reset.html"), name='password-reset'), url(r'^password-reset/confirm/$', TemplateView.as_view(template_name="password_reset_confirm.html"), name='password-reset-confirm'), | cs |
이런식으로도 url을 테스트 해 봤습니다. user_details.html은 제가 만들었습니다.
나머지 템플릿도 취향따라 바꾸셔도 됩니다. TemplateView.as_view가 모든 url에 적용되었으니 views.py에서 할 일은 상당히 줄어들 것입니다.
url(r'^user-details/$', TemplateView.as_view(template_name="user_details.html"), name='user-details'), url(r'^password-change/$', TemplateView.as_view(template_name="password_change.html"), name='password-change'), | cs |
이것도 써보려고 했습니다. password-reset 시에 url에 pk인자를 넘겼습니다. django 2.0 버전에선 pk 인자를 넘기는 방법이 조금 달라졌으니 유의하시기 바랍니다.
url(r'^password-reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', TemplateView.as_view(template_name="password_reset_confirm.html"), name='password_reset_confirm'), url(r'^rest-auth/', include('rest_auth.urls')), url(r'^rest-auth/registration/', include('rest_auth.registration.urls')), url(r'^account/', include('allauth.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^accounts/profile/$', RedirectView.as_view(url='/', permanent=True), name='profile-redirect'), | cs |
include를 통해 전체적인 url구조를 결정했습니다.
이렇게 까지 설정하니 더 설정할 것이 없었습니다. serializers.py를 만들겠습니다.
3. serializers.py
from rest_framework import serializers from blog.models import Post from django.contrib.auth.models import User from drf_extra_fields.geo_fields import PointField | cs |
serializer class를 만들도록 합니다.
class UserSerializer(serializers.ModelSerializer): related_postwriter = serializers.PrimaryKeyRelatedField(many=True, read_only=True) class Meta: model = User fields = ('username', 'email', 'related_postwriter') | cs |
User 모델을 위한 serializer입니다. django의 form과 모양이 상당히 닮아있습니다.
class PostSerializer(serializers.ModelSerializer): author = serializers.ReadOnlyField(source='author.username') point = PointField(required=True) #이것은 선택사항, 사용자가 결정할 일이므로 신중하게 선택하자. class Meta: model = Post # fields = ('author', 'text', 'image', ) fields = ('author', 'text', 'image', 'point', 'created_date') def create(self, validated_data): validated_data['author'] = self.context['request'].user return super(PostSerializer, self).create(validated_data) | cs |
create 같은 함수를 따로 지정해주어 어떻게 REST통신시에 serializer가 함수를 처리할 지 지정할 수 있습니다.
Post 모델을 위한 serializer입니다.
import 를 잊지 맙시다.
이렇게하면 django-rest-framework의 기본 설정이 끝납니다.
끝으로, drf_extra_fields는 구글에 검색하면 다운받을 수 있습니다. Point를 편리하게 조작할 수 있게 해 줍니다.
drf_extra_fields : https://github.com/Hipo/drf-extra-fields
'Python' 카테고리의 다른 글
[django] django에서 DoesNotExist와 인증 Backend 만들기 (0) | 2018.02.07 |
---|---|
[django] django 에서 recaptcha 사용 (0) | 2018.02.05 |
[django] 간단한 웹 게임 프로그램 작성에 필요한 설정 (0) | 2018.02.04 |
[django] GeoDjango를 쓰기 위한 model과 view 설정 (0) | 2018.02.03 |
[django] Django-pipeline 쓰기 (0) | 2018.02.03 |