From 30c16080eca6d387e32616d3d56b078dcaf5e068 Mon Sep 17 00:00:00 2001 From: Mitch Tabian Date: Fri, 5 Jul 2019 13:52:55 -0700 Subject: [PATCH 1/7] Serializers (Django REST-framework) --- src/blog/serializers.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/blog/serializers.py diff --git a/src/blog/serializers.py b/src/blog/serializers.py new file mode 100644 index 0000000..f53c080 --- /dev/null +++ b/src/blog/serializers.py @@ -0,0 +1,20 @@ +from rest_framework import serializers + +from blog.models import BlogPost + + + + +class BlogPostSerializer(serializers.Serializer): + Meta: + model = BlogPost + fields = ['title', 'body', 'image'] + + + + + + + + + From a95ed2bf6c9c2e6d33871b0df6eee44b2266b92f Mon Sep 17 00:00:00 2001 From: Mitch Tabian Date: Fri, 5 Jul 2019 14:21:49 -0700 Subject: [PATCH 2/7] Views (Django REST-framework) --- .../__pycache__/serializers.cpython-37.pyc | Bin 0 -> 630 bytes src/blog/__pycache__/urls-api.cpython-37.pyc | Bin 0 -> 324 bytes src/blog/__pycache__/urls.cpython-37.pyc | Bin 432 -> 432 bytes src/blog/__pycache__/urls_api.cpython-37.pyc | Bin 0 -> 328 bytes src/blog/__pycache__/views.cpython-37.pyc | Bin 2111 -> 2111 bytes src/blog/__pycache__/views_api.cpython-37.pyc | Bin 0 -> 846 bytes src/blog/serializers.py | 5 ++-- src/blog/urls.py | 1 + src/blog/urls_api.py | 10 ++++++++ src/blog/views.py | 1 + src/blog/views_api.py | 22 ++++++++++++++++++ src/mysite/urls.py | 1 + 12 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/blog/__pycache__/serializers.cpython-37.pyc create mode 100644 src/blog/__pycache__/urls-api.cpython-37.pyc create mode 100644 src/blog/__pycache__/urls_api.cpython-37.pyc create mode 100644 src/blog/__pycache__/views_api.cpython-37.pyc create mode 100644 src/blog/urls_api.py create mode 100644 src/blog/views_api.py diff --git a/src/blog/__pycache__/serializers.cpython-37.pyc b/src/blog/__pycache__/serializers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d798928573437a0316b6d8955740f42a0c4f0f9b GIT binary patch literal 630 zcmah`%}N6?5KcDPx@xQ7MeyQzFZ%!@B5lD_i_n9xtc0~mw_CG~CR;?W^<{ht-y>J? z;464?W=pN0;J{42$uQsibvvCM0@8XtzJ7=I4V|@c0Oz1C0V9c|np8BU6mg(~ilvN_ z3nH21&qQ)XXMD-hP=+HCw>}_;#MJLPWy@TbPs%!Qqpmi^rE&Eb<7;66&OzM~7)4Sl zNg4n%l>smZ%OGWv0W0?h>-^C-?f*=Qr5w2=E3iKfOySevZ>D6R>fDEQS!?C_jggN& zEUUaw!?@)mA?A6dgz!5;R7Nf|;w=ti+{z=xK z<@3T^S~FAQ+GRZ>%Xx8C*3&^*kEhsF&n&D{nX}{U2Hfn&29vu-&#}u0w}l6aD5rKG zz%b?(f9*CJylV5kslGyc7{J6WP#1uSXyfCIdsewxOf1a#VC=2Mu;0Zdl4dBkns9%B Z6K*chdw#F6cQ;2n4nW=5WZ)hiRP zz{I(TlYIBt_x*UgT+R{H=f~;&JIt?e`L7tj29CXe#u3K~^|-`1;7CP1DG6XwQh_-Y zgvUI2B`q#vKD$ME`VA_SV^2rsI+!PHlrB(48S<_S@qY9a4@b6-L_UWqEd{SbK!PF+u7I;A^ F`32CuTlfF~ literal 0 HcmV?d00001 diff --git a/src/blog/__pycache__/urls.cpython-37.pyc b/src/blog/__pycache__/urls.cpython-37.pyc index 26a5f926bdcdd2d9cac3bfe42b9e7e7064dad2c7..8eb0c56012e38a76e11d66308ad80507acc2f608 100644 GIT binary patch delta 47 zcmdnMyn&h5iI7P^^f5au8!UI|mCh4MKFFr%uf+O8m^4oFc@WMV6E<;0QgfZ!ka5WawkAMwh> zFEDX#)sy`0-Ra(Y@_If$Lr_=Wmrq~Nf5LF87|05qy#e5eV}&|gU>ta)qK*^Sfw>m?1si0=g=11x&q_DdixjV(2Kqi(ST#1wYo8ns zf~;qqxX%(l<$KmQIv=F7~yOpIEaAF`%0GI~#TXMfMh N$ivJb%E8T{2mqdA4RQbg diff --git a/src/blog/__pycache__/views_api.cpython-37.pyc b/src/blog/__pycache__/views_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd93924d2bb026226071b891ff1f8527d1c65aeb GIT binary patch literal 846 zcmZ8f&2G~`5Z>`m?AS>ag(8H6;G9d;Lr(}*(4@eHG$KK*tbpZaw}~A)Yj!uZMd>MA z`yjjo58?|4PP_sqW;ZGYW;Nq)XXN?$W)GXqfS`Q;_T>HCBIJj@+=`9hIja1Ch7t-n zDIfyS*vhTKj%q7hPrLpcL%#*z7I)&Zeg5W03J6fS-$ zkDq01s$^x)n5r6m&g6irqsvq(p{X~2MD5q(@i5-s+m8pw=J6*Zm4 zEk(Lil|vJibezf)?Bj}IinqY960wxd4y*V)CZ*}q{UdiYFQS_Jj`X--&#=HMX9s{c*+A0( IJeE=WH*|I1g8%>k literal 0 HcmV?d00001 diff --git a/src/blog/serializers.py b/src/blog/serializers.py index f53c080..b1099f8 100644 --- a/src/blog/serializers.py +++ b/src/blog/serializers.py @@ -4,9 +4,8 @@ - -class BlogPostSerializer(serializers.Serializer): - Meta: +class BlogPostSerializer(serializers.ModelSerializer): + class Meta: model = BlogPost fields = ['title', 'body', 'image'] diff --git a/src/blog/urls.py b/src/blog/urls.py index c11752b..8b79ee9 100644 --- a/src/blog/urls.py +++ b/src/blog/urls.py @@ -4,6 +4,7 @@ create_blog_view, detail_blog_view, edit_blog_view, + ) app_name = 'blog' diff --git a/src/blog/urls_api.py b/src/blog/urls_api.py new file mode 100644 index 0000000..c1b1dda --- /dev/null +++ b/src/blog/urls_api.py @@ -0,0 +1,10 @@ +from django.urls import path +from blog.views_api import( + api_detail_blog_view, +) + +app_name = 'blog' + +urlpatterns = [ + path('/', api_detail_blog_view, name="detail"), +] \ No newline at end of file diff --git a/src/blog/views.py b/src/blog/views.py index 8f7003c..f7bfc9b 100644 --- a/src/blog/views.py +++ b/src/blog/views.py @@ -4,6 +4,7 @@ from blog.models import BlogPost from blog.forms import CreateBlogPostForm, UpdateBlogPostForm + from account.models import Account diff --git a/src/blog/views_api.py b/src/blog/views_api.py new file mode 100644 index 0000000..2038021 --- /dev/null +++ b/src/blog/views_api.py @@ -0,0 +1,22 @@ +from rest_framework import status +from rest_framework.response import Response +from rest_framework.decorators import api_view + +from blog.models import BlogPost +from blog.serializers import BlogPostSerializer + +from django.views.decorators.csrf import csrf_exempt + + +@api_view(['GET',]) +def api_detail_blog_view(request, slug): + + try: + blog_post = BlogPost.objects.get(slug=slug) + except BlogPost.DoesNotExist: + return Response(status=status.HTTP_404_NOT_FOUND) + + if request.method == 'GET': + serializer = BlogPostSerializer(blog_post) + print(serializer.data) + return Response(serializer.data) \ No newline at end of file diff --git a/src/mysite/urls.py b/src/mysite/urls.py index 5c22cec..0f0bafe 100644 --- a/src/mysite/urls.py +++ b/src/mysite/urls.py @@ -36,6 +36,7 @@ path('admin/', admin.site.urls), path('account/', account_view, name="account"), path('blog/', include('blog.urls', 'blog')), + path('api/blog/', include('blog.urls_api', 'blog_api')), path('login/', login_view, name="login"), path('logout/', logout_view, name="logout"), path('must_authenticate/', must_authenticate_view, name="must_authenticate"), From ca4d745cdc5baac869aca19b11fed260b0da9c6e Mon Sep 17 00:00:00 2001 From: Mitch Tabian Date: Fri, 5 Jul 2019 14:23:27 -0700 Subject: [PATCH 3/7] Views (Django REST-framework) --- src/blog/__pycache__/views_api.cpython-37.pyc | Bin 846 -> 763 bytes src/blog/views_api.py | 3 --- 2 files changed, 3 deletions(-) diff --git a/src/blog/__pycache__/views_api.cpython-37.pyc b/src/blog/__pycache__/views_api.cpython-37.pyc index dd93924d2bb026226071b891ff1f8527d1c65aeb..0ee974dafe8b900bf17159e349e60856781821ba 100644 GIT binary patch delta 259 zcmX@d_M4U0iIQmyZ>j$ScVhG*R7NB9%3TEuFEMF@-&aqlKZFF^VgNGnhe> zYhstD%q?bj*N|i;kR~8t0b&jyb_U|&po#zN4E#zsYM7cCYne+}YM8S)n;C-{QW$`m zS^P8^Z?P2Tl%{Jk7J;-Eu>%QBuE}MLzCtW1i6x1eEVtN;QVUB{i%W_)Cf{L{WfYwJ zi!nx?6J$0YkYHeDViaN&VB}-sV&q^f5(bL+X>w04XR0v+bBY9kB1nV~kb8^6CO1E& VG$+-L5y&eBd6tI}2$_JG834>|G4%id delta 320 zcmey(dXA0PiIjRA<0Z2^MHT_h&h1R8HkHx zCO)>4j40u#VQOZqWiH{YVb0=eW@Kb2VF9rw8!$? Date: Sat, 6 Jul 2019 09:51:25 -0700 Subject: [PATCH 4/7] GET, UPDATE, POST, DELETE - Function Views (Django REST-framework) --- .../__pycache__/serializers.cpython-37.pyc | Bin 630 -> 630 bytes src/blog/__pycache__/urls_api.cpython-37.pyc | Bin 328 -> 517 bytes src/blog/__pycache__/views_api.cpython-37.pyc | Bin 763 -> 2112 bytes src/blog/serializers.py | 5 +- src/blog/urls_api.py | 6 ++ src/blog/views_api.py | 65 +++++++++++++++++- 6 files changed, 70 insertions(+), 6 deletions(-) diff --git a/src/blog/__pycache__/serializers.cpython-37.pyc b/src/blog/__pycache__/serializers.cpython-37.pyc index d798928573437a0316b6d8955740f42a0c4f0f9b..1ddff53fa0d69dd5f6d03e365f52f63e03183ed7 100644 GIT binary patch delta 36 qcmeyy@{NVpiIco0^egD3FH z#49l2O9~QTE5|1%_WgX7WfV=29pv@o<^?141~1>kw`O4pelZzxQL|^2y!@g7N@-L730OD-=iXmV#nzNSk$= zn3$uiEmJPKtd!}UY>M>06c0n%w>;~_-;@g}{-?PTzxNU-w)19M_Qm|v&;bG9I;+Gk z+J6`rh7RjbJV4+SzziMAU&Lb*@NHHX&9qlitC8)69RO(x*Vd_RMmaWA1jGfQR*avu zZ3$2ONmtDSDTF$EJl@^Is ic>>r3t^w3(`)K@G)$m@5x&6gRhgL#->=7r#Fh2pHtCBk@r46p(j4nSON03=cvQW$d>av7r-89{8O9Hw06 zC}tp=If^BfF@+_SIfXTat(Q5SF^V;XJ(xk0<0ViRgC^rGmV(5R3?MC%SdbZ?l3J3O xnG>Islb;@6mO1gGBD0?++hlJ>^~sHlQfwf%6md;n$QZ)K24wOu^02Tl0{})tA=3Z= diff --git a/src/blog/__pycache__/views_api.cpython-37.pyc b/src/blog/__pycache__/views_api.cpython-37.pyc index 0ee974dafe8b900bf17159e349e60856781821ba..2b568bac910ac6b078759f2984c7cf112fbe1ca4 100644 GIT binary patch literal 2112 zcmbtVO>Y}T7@pZrf5&l>rs1QMA_P7V1=JI&DiYhk0UTpHDq00r8_(dZv-X;qaY~UR zA*I*+hvo)9hwEH9_0EYC?>ieOZs1Uhug;Ck@q{U84J3Hb{f zi_3=O3wY%35Ex-JA!8a)in*0oV>_@-ZYR#z4P28ui8uBG-{fwR8|Q<($-Sg7E(S%& z{h-8hL7C-)3M&LFtQb_e%SuCfPFa~%o|AJLtU_hQRH|&%RBBMEnaUblH~4?Lw_d_(Nu6p>sz}WwWVtSv({v&^=Fv0`Ph)Gikyg*M{}SDa~oHf51X27;T!{;Jgb|ZEZULDY*?oPCl+N0^@8x=NBil~h!2$1_K+)GYNlMaQ`Pzy5H}F4|g7h?friE<^Dmtsl72*$0-w_3!)v^WmI>xFZjA!YSaU z3-TJRKZv*sz5nbsKR;}aqRBArh}10Nu#vKOGJF!N<8Na%I7Xx!=}bs|D8=9qM>|Av zWC%2EPoL>^q>FJC#Yt%9!rm1aT;lx1wrGu3X~ing92IXtMcbW&8~9zQT*Lny8gBsq zZwNn-k!Q|@b!Nxp3}|>!xFlixwWJ2s8LC z_<9>w2KhSvR1Iwc_b93uRxw;NC2H7Q!+^Y)Z*(q};VCGUfefNkt}6$f=5D_g_6{12 zR9#?1oXalQXJpFdiF?2b2sN1zTatHM;hgyQFI$ zblnGC1Dc@gJQ$9r3Zo+PP{pQQf_6D;8%+K7OI!qaku^Pm=tVQI4!Y}##gyZc@7A>`to88ZXuT9W9E s=KLAanB6Q15KpZzCp-5D7BNfsW8_jI2PF!(l||H@xvg5cR;yM21$8IW(f|Me delta 247 zcmX>g@SBy-iIQmyZ==n#d=?7&KAcULut>g)N=2nK6Yug`3X?+^n>pBl+BCU}SSR0S)MSjB%*iAp&IS~^#gdX(lBmgYi@hkdur#%} zq=;j(4U;UR;N&Q#7hief$>!NAPKD8wkh$j8LR$iY}73>5Lx/', api_detail_blog_view, name="detail"), + path('/update', api_update_blog_view, name="update"), + path('/delete', api_delete_blog_view, name="delete"), + path('create', api_create_blog_view, name="create"), ] \ No newline at end of file diff --git a/src/blog/views_api.py b/src/blog/views_api.py index cd6d667..7c04304 100644 --- a/src/blog/views_api.py +++ b/src/blog/views_api.py @@ -2,11 +2,17 @@ from rest_framework.response import Response from rest_framework.decorators import api_view +from account.models import Account from blog.models import BlogPost from blog.serializers import BlogPostSerializer +SUCCESS = 'success' +ERROR = 'error' +DELETE_SUCCESS = 'deleted' +UPDATE_SUCCESS = 'updated' +CREATE_SUCCESS = 'created' -@api_view(['GET',]) +@api_view(['GET', ]) def api_detail_blog_view(request, slug): try: @@ -16,4 +22,59 @@ def api_detail_blog_view(request, slug): if request.method == 'GET': serializer = BlogPostSerializer(blog_post) - return Response(serializer.data) \ No newline at end of file + return Response(serializer.data) + + +@api_view(['PUT',]) +def api_update_blog_view(request, slug): + + try: + blog_post = BlogPost.objects.get(slug=slug) + except BlogPost.DoesNotExist: + return Response(status=status.HTTP_404_NOT_FOUND) + + if request.method == 'PUT': + serializer = BlogPostSerializer(blog_post, data=request.data) + data = {} + if serializer.is_valid(): + serializer.save() + data[SUCCESS] = UPDATE_SUCCESS + return Response(data=data) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +@api_view(['DELETE',]) +def api_delete_blog_view(request, slug): + + try: + blog_post = BlogPost.objects.get(slug=slug) + except BlogPost.DoesNotExist: + return Response(status=status.HTTP_404_NOT_FOUND) + + if request.method == 'DELETE': + operation = blog_post.delete() + data = {} + if operation: + data[SUCCESS] = DELETE_SUCCESS + return Response(data=data) + + +@api_view(['POST']) +def api_create_blog_view(request): + + account = Account.objects.get(pk=1) + + blog_post = BlogPost(author=account) + + if request.method == 'POST': + serializer = BlogPostSerializer(blog_post, data=request.data) + data = {} + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + + + + From 816d3f592de939a87e0f1e2247530af86b622003 Mon Sep 17 00:00:00 2001 From: Mitch Tabian Date: Sat, 6 Jul 2019 09:57:38 -0700 Subject: [PATCH 5/7] GET, UPDATE, POST, DELETE - Function Views (Django REST-framework) --- src/blog/api/__init__.py | 0 src/blog/api/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 155 bytes src/blog/api/__pycache__/urls.cpython-37.pyc | Bin 0 -> 517 bytes src/blog/api/__pycache__/views.cpython-37.pyc | Bin 0 -> 2112 bytes src/blog/{ => api}/serializers.py | 0 src/blog/{urls_api.py => api/urls.py} | 2 +- src/blog/{views_api.py => api/views.py} | 0 7 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/blog/api/__init__.py create mode 100644 src/blog/api/__pycache__/__init__.cpython-37.pyc create mode 100644 src/blog/api/__pycache__/urls.cpython-37.pyc create mode 100644 src/blog/api/__pycache__/views.cpython-37.pyc rename src/blog/{ => api}/serializers.py (100%) rename src/blog/{urls_api.py => api/urls.py} (93%) rename src/blog/{views_api.py => api/views.py} (100%) diff --git a/src/blog/api/__init__.py b/src/blog/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/blog/api/__pycache__/__init__.cpython-37.pyc b/src/blog/api/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e65334eaa51b3606971bbd190333785f6cc60ff GIT binary patch literal 155 zcmZ?b<>g`kf;|@%VnOs{5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6wo#VW=nD={xU zKcFZ-D>b>KIL0|YB{MHQJhLRjH?t%;!zm{}-8sLss5mvIxF|U$3CN8}EXa(BkI&4@ bEQycTE2zB1VUwGmQks)$2QvLL5HkP(v*{<> literal 0 HcmV?d00001 diff --git a/src/blog/api/__pycache__/urls.cpython-37.pyc b/src/blog/api/__pycache__/urls.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3828ca9c44806d5a69026913a0e6e5d3918123f9 GIT binary patch literal 517 zcmZXRy-ve06ou`^Nz*1l3=BvttXaa2s;X+cf{+-Hte_BLD@~O@*$D{Vfd^sbQ5d~4 z@d`}bO9~QTE5|1%_WgX7We`jWjHB1%>laGM8@_xG7t8`4eFGwhpe3m&rxg9D990&# zD#lr5bGvf51G&Y=k_sj*VGHNU0zZ~axH~_QwwUg`CmrFT&lz`xe@VjN9VjHEhP7$8 z37I)a+aeLNON%nOEt@>KE9Cu<_N_=e`8O4^l>gIA$=`b!7JD4eblK(hAsRr^9UTbXq_UNxeq^Q)rUoE2TRSpsL(^h(QE jt1L!r4A>a2615M;omGwKOF4&MOtcT;)59^de2ViEykVI6 literal 0 HcmV?d00001 diff --git a/src/blog/api/__pycache__/views.cpython-37.pyc b/src/blog/api/__pycache__/views.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04977d67a0e371e756a8b91a25f8340b04af5c57 GIT binary patch literal 2112 zcmbtVO>Y}T7@pZrf5&l>rs1O$5CR{F0_q7>6^XsT0UTpHDq0y<8_(dZv-X;qbxM&V zA*I*+hvo)9hwEICkb39DiT9n29XD{O)LrfCci!2ZkLP*j@jaRm(O;@UHT~}&Qsp-lF+tif}sBG!V z9k#72o9u3v)OTLMYDt|cN2XyqlaS>)TuzgTSQ3ePRuX8-oU^`z-7UcgQo$H z>_B*0OUa0ij5%fWlAarn$>g3zpk|&H#2zJhr&el@9A;e7F8Pkk$;f5qsUccvZf;!A zb2GK(<|uywy^O$)trjfWlJRUytV`qEjL13A@VszE#1wvuS4doGZl&diK;Ybhw}2o`RR!o=13Has!fYT+ zhuw+Wqu(^Q&dC}jfTqJ`tP$~l%glAk;j@r%ro)>hF z8V#@8Rqi5jw0fo5yrz3EIM{Cn9q-#CuiLBJVhe{vWW^l}+lv`ApIO*}T1HEz{2N-{ zf*y&)uhLSX7EptCfr|I=Tc_!L?e)Cn5qXKDV|e2=IQn63JkMQ`1v{db=7EvIDkJ*H z{D*<}VcrD;#aCrOIhhNnO17m1-r^k`?KYY!pG>(3(&_D z2bdzN;zOt_t9{t*4Jf_?7ov%#qYdW-lFV)xMLRjCsR_noqVa%|L8D+REVZ?+9cHiS z+67(rK-YjK=sFLE-N*VPl86r1BExmeSG0v2-kQkH_S}^RTP|A_6^#P zU>u1DjF@04U@8msR;lm~1w6X0KJaQq_L-J*i{_*GrGv00fp0E$i7UZ-=|5g$MU( tZ`9{ci$?EeMSyr}g+AH2hp>oQ%pW0_5;-VQxQ#5L?(}Wc%C%ap`Y*1?)RO=J literal 0 HcmV?d00001 diff --git a/src/blog/serializers.py b/src/blog/api/serializers.py similarity index 100% rename from src/blog/serializers.py rename to src/blog/api/serializers.py diff --git a/src/blog/urls_api.py b/src/blog/api/urls.py similarity index 93% rename from src/blog/urls_api.py rename to src/blog/api/urls.py index 368f8f0..69bee88 100644 --- a/src/blog/urls_api.py +++ b/src/blog/api/urls.py @@ -1,5 +1,5 @@ from django.urls import path -from blog.views_api import( +from blog.api.views import( api_detail_blog_view, api_update_blog_view, api_delete_blog_view, diff --git a/src/blog/views_api.py b/src/blog/api/views.py similarity index 100% rename from src/blog/views_api.py rename to src/blog/api/views.py From ba3c24538de12cc4f5d7e43b5965f0c73c9a46dd Mon Sep 17 00:00:00 2001 From: Mitch Tabian Date: Sat, 6 Jul 2019 10:06:34 -0700 Subject: [PATCH 6/7] GET, UPDATE, POST, DELETE - Function Views (Django REST-framework) --- src/blog/api/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blog/api/views.py b/src/blog/api/views.py index 7c04304..785dd99 100644 --- a/src/blog/api/views.py +++ b/src/blog/api/views.py @@ -4,7 +4,7 @@ from account.models import Account from blog.models import BlogPost -from blog.serializers import BlogPostSerializer +from blog.api.serializers import BlogPostSerializer SUCCESS = 'success' ERROR = 'error' From dc95e4d32c2920c5cd525e17df804f672bdb38ed Mon Sep 17 00:00:00 2001 From: Mitch Tabian Date: Mon, 8 Jul 2019 15:52:45 -0700 Subject: [PATCH 7/7] Register a New User (Django Rest-framework) --- src/account/__pycache__/views.cpython-37.pyc | Bin 2124 -> 2124 bytes src/account/api/__init__.py | 0 .../api/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 158 bytes .../__pycache__/serializers.cpython-37.pyc | Bin 0 -> 1138 bytes .../api/__pycache__/urls.cpython-37.pyc | Bin 0 -> 327 bytes .../api/__pycache__/views.cpython-37.pyc | Bin 0 -> 773 bytes src/account/api/serializers.py | 44 ++++++++++++++++++ src/account/api/urls.py | 12 +++++ src/account/api/views.py | 21 +++++++++ src/mysite/urls.py | 5 +- 10 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/account/api/__init__.py create mode 100644 src/account/api/__pycache__/__init__.cpython-37.pyc create mode 100644 src/account/api/__pycache__/serializers.cpython-37.pyc create mode 100644 src/account/api/__pycache__/urls.cpython-37.pyc create mode 100644 src/account/api/__pycache__/views.cpython-37.pyc create mode 100644 src/account/api/serializers.py create mode 100644 src/account/api/urls.py create mode 100644 src/account/api/views.py diff --git a/src/account/__pycache__/views.cpython-37.pyc b/src/account/__pycache__/views.cpython-37.pyc index 00d9ad8f7b5ed47068f6718cf072b8abbe4bebb3..e39e58f68e54444123ca34cedb890a9266be8f58 100644 GIT binary patch delta 70 zcmX>ja7KXJiIja7KXJiIAz+ Y|6uE7)SBGJ-o~a0)Ka81S%||50Kt0`f&c&j diff --git a/src/account/api/__init__.py b/src/account/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/account/api/__pycache__/__init__.cpython-37.pyc b/src/account/api/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f53cb43e61eba56517e31a853b5a85e3e08796f8 GIT binary patch literal 158 zcmZ?b<>g`kf~}h=2h`Aj1KOi&=m~3PUi1CZpd`LNn^}^a;gpk~?wns*RGb=9T$CJ>n4FwnnpYB&SdbYL fAD@|*SrQ+wS5SG2!zMRBr8Fni4rIY+AZ7pn5<@8B literal 0 HcmV?d00001 diff --git a/src/account/api/__pycache__/serializers.cpython-37.pyc b/src/account/api/__pycache__/serializers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e8fe0a51acff1b8b697b746ef01ba0ce5cbb82a GIT binary patch literal 1138 zcmZ`&&2AGh5VpNP*`!G-6{x6?P$e$xB?rU_Ap}hU3DKyc6`)nn%8K1|(@i$mPD`rv zLVN8yv`3zVckq=HufT~JZ_^a1Sn_ymujl(_=G%=%qefsfem?s0-Y4W2Zsr5_Y?P+> zL7LiHnhpyw$DLL*%Nyn4;{YyYZo|Dy=0e-L{022h501F%>mNj|z&FnPdAIqj zyE)*aezC2Jf$SOGZ5JXN^*?21e=9S+{f)fnw~L9=va40E%gau6`8ey|Xku$TwLWIE z3ZXS75K*7jnYs&ZkAlI0EydY}sXv1;WJU&5(6w@9YoMERc0%2$zeY}&^8)a^8Jl?r zp4u?%0t$@cV*Am3Ts9R&pL5vn@Vbv?kSKQ{2vD{eA2v1tK}r7%W5req23lhm36F9fj|(uR*oic@SP(vwP9%HOxiR*va^i|J^BwdLssP zU(CWn?uBV>IYI9rL9=>&(wAb?Wpr@B@I2&V9CvXnEKrPjUV(8R1mfq8@LO%K`1a`c z0Cuk$?|5aUHtm!4-JSMLx9M$L*$JHD4jO)n;uyu_3(D~=$c3SN!J(Vl( zz#e%Kjy!;`oOlIJjMJ|8aWs=J9%ttJW_)sV)FrsSe|z%&10&>z`?y^mg6C-Z1v*YR zEl5cdN*!heE4{>Pu~+zIkOVFEi?EE6h!PR-U`}_Ghdla3b~K53JSBt9Ps~LI)P~w* zrq+n!bD>wN(!$|vC1-0XHi#ddi@DSWG9y(r6(F-hUJJ1P+3V?>oVq-?d^AUNjHVNG z4Ot@9O9pQZMa($+Ot(~$Eov6AP+#iv~TLy@N7KMny5vjt4E~70o zal>|Wijt9hbP6F>KyE(IOm_WP*Lg0qzNm}hst+w)0fP4{vFX=Zz|h8U5N88XX0ouc z+pn@x3_3O}g;^*L0VahAosFfQtx+epzRuPHIxgZSWJ3Xtp_DiyB_@yy*E M?b!E_c8~SE--zhavj6}9 literal 0 HcmV?d00001 diff --git a/src/account/api/serializers.py b/src/account/api/serializers.py new file mode 100644 index 0000000..c92bf88 --- /dev/null +++ b/src/account/api/serializers.py @@ -0,0 +1,44 @@ +from rest_framework import serializers + +from account.models import Account + + +# class LoginSerializer(serializers.ModelSerializer): +# class Meta: +# model = Account +# fields = ['email', 'password',] + +# extra_kwargs = {'password': {'write_only': True}} + +# def validate(self, data): +# password = data.get('password') +# email = data.get('email') + + +class RegistrationSerializer(serializers.ModelSerializer): + + password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True) + + class Meta: + model = Account + fields = ['email', 'username', 'password', 'password2'] + extra_kwargs = { + 'password': {'write_only': True}, + } + + + def save(self): + + account = Account( + email=self.validated_data['email'], + username=self.validated_data['username'] + ) + password = self.validated_data['password'] + password2 = self.validated_data['password2'] + if password != password2: + raise serializers.ValidationError({'password': 'Passwords must match.'}) + account.set_password(password) + account.save() + return account + + diff --git a/src/account/api/urls.py b/src/account/api/urls.py new file mode 100644 index 0000000..441bc28 --- /dev/null +++ b/src/account/api/urls.py @@ -0,0 +1,12 @@ +from django.urls import path +from account.api.views import( + registration_view, + +) + +app_name = 'account' + +urlpatterns = [ + path('register', registration_view, name="register"), +] + diff --git a/src/account/api/views.py b/src/account/api/views.py new file mode 100644 index 0000000..77975ac --- /dev/null +++ b/src/account/api/views.py @@ -0,0 +1,21 @@ +from rest_framework import status +from rest_framework.response import Response +from rest_framework.decorators import api_view + +from account.api.serializers import RegistrationSerializer + + +@api_view(['POST', ]) +def registration_view(request): + + if request.method == 'POST': + serializer = RegistrationSerializer(data=request.data) + data = {} + if serializer.is_valid(): + account = serializer.save() + data['response'] = 'successfully registered new user.' + data['email'] = account.email + data['username'] = account.username + else: + data = serializer.errors + return Response(data) \ No newline at end of file diff --git a/src/mysite/urls.py b/src/mysite/urls.py index 0f0bafe..c6d4879 100644 --- a/src/mysite/urls.py +++ b/src/mysite/urls.py @@ -36,11 +36,14 @@ path('admin/', admin.site.urls), path('account/', account_view, name="account"), path('blog/', include('blog.urls', 'blog')), - path('api/blog/', include('blog.urls_api', 'blog_api')), path('login/', login_view, name="login"), path('logout/', logout_view, name="logout"), path('must_authenticate/', must_authenticate_view, name="must_authenticate"), path('register/', registration_view, name="register"), + + # REST-framework + path('api/blog/', include('blog.api.urls', 'blog_api')), + path('api/account/', include('account.api.urls', 'account_api')), # Password reset links (ref: https://github.com/django/django/blob/master/django/contrib/auth/views.py) path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(template_name='registration/password_change_done.html'),