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
기본적으로 rest_framework에서 제공하는 serializers 모듈을 가져옵니다. serializer는 json같은 형태로 데이터를 변경시켜주는 역할을 합니다.
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