Prechádzať zdrojové kódy

完成并测试了公钥的add和get接口;完善了接口文档格式,增强可读性;修改了返回数据的格式,通过http状态码返回请求状态

Shellmiao 3 rokov pred
rodič
commit
4b5cd90e2e

+ 1 - 0
MeChat/settings.py

@@ -37,6 +37,7 @@ INSTALLED_APPS = [
     'django.contrib.staticfiles',
     'chat',
     'account',
+    'infrastructure',
 ]
 
 MIDDLEWARE = [

+ 1 - 0
MeChat/urls.py

@@ -20,4 +20,5 @@ urlpatterns = [
     path('admin/', admin.site.urls),
     path('chat/', include(('chat.urls', "chat"), namespace='chat')),
     path('account/', include(('account.urls', "account"), namespace='account')),
+    path('infrastructure/', include(('infrastructure.urls', "infrastructure"), namespace='infrastructure')),
 ]

+ 51 - 41
account/interface.md

@@ -1,22 +1,8 @@
 # 登录
-### 返回值接口约定
 ******
-***第一个字段:result,第二个字段:token***
-******
-result: 'token time out'  
-  
-result: 'detected new device, please login',  
-  
-result: 'wrong account or password',  
-
-result: 'illegal input',  
-
-result: 'illegal method, please use post',  
 
-result: 'login successfully',   token:'xxxxxx'  
+## 请求接口约定(均使用POST)
 
-### 请求接口约定(均使用POST)
-******
 接口链接:'account/login'
 
 username(选填)
@@ -25,29 +11,33 @@ password(选填)
 
 token(必填,若客户端无token,则传输字符串'token'来表示无token)
 
+## 返回值接口约定
+
+***http状态码 token***
+
+420:token已过期,请重新登录
+  
+401:账户或密码错误
+
+400:请求不合法
+
+200+token:成功+返回新token 
 
 # 登出
-### 返回值接口约定
-******
-***第一个字段:result***
-******
-result: 'logout successfully', 
-### 请求接口约定(均使用POST)
 ******
+
+## 请求接口约定(均使用POST)
 接口链接:'account/logout'
 
-# 注册
-### 返回值接口约定
-******
-***第一个字段:result***
-******
-result: 'reg successfully', 
+## 返回值接口约定
+***http状态码***
 
-result: 'illegal input',  
+200:登出成功
 
-result: 'illegal method, please use post',  
-### 请求接口约定(均使用POST)
+# 注册
 ******
+## 请求接口约定(均使用POST)
+
 接口链接:'account/register'
 
 username(必填)
@@ -56,27 +46,47 @@ password(必填)
 
 password2(必填)
 
+## 返回值接口约定
+
+***http状态码***
+
+200:注册成功,请登录
+
+400:请求不合法
+
 # 编辑用户资料
-### 返回值接口约定
 ******
-***第一个字段:result***
-******
-result: 'You do not have permission to do this', 
+## 请求接口约定(均使用POST)
+
+接口链接:'account/edit/(username)'
 
-result: 'edit successfully',
+bio(选填)
 
-result: 'illegal input',
+avatar(选填)(头像)
 
-result: 'illegal method, please use post',
+phone(选填)
 
+## 返回值接口约定
+***http状态码***
 
-### 请求接口约定(均使用POST)
+403:你没有权限进行此操作(修改此用户信息的操作)
 
+200:编辑成功
+
+400:请求不合法
+
+
+# 获得用户资料
 ******
+## 请求接口约定(均使用POST)
+
 接口链接:'account/profile/(username)'
 
-bio(选填)
+## 返回值接口约定
+***http状态码 用户资料字典***
+
+200+字典:获取成功+用户资料字典
+
+400:请求不合法
 
-avatar(选填)
 
-phone(选填)

+ 19 - 33
account/views.py

@@ -39,16 +39,14 @@ def user_login(request):
                         # 登录
                         user = device.user
                         login(request, user)
-                        response = {'result': 'login successfully', 'token': device.token}
-                        return HttpResponse(json.dumps(response))
+                        response = {'token': device.token}
+                        return HttpResponse(json.dumps(response), status=200)
                         # return redirect("chat:index")
                     else:
-                        response = {'result': 'token time out'}
-                        return HttpResponse(json.dumps(response))
+                        return HttpResponse(status=420)
                 # 已过期的token并且已经被删除
                 except Devices.DoesNotExist:
-                    response = {'result': 'detected new device, please login'}
-                    return HttpResponse(json.dumps(response))
+                    return HttpResponse(status=420)
             else:
                 # 检测账号密码是否匹配数据库中的一个用户
                 # 如果均匹配,则返回此User对象
@@ -69,14 +67,12 @@ def user_login(request):
                             # 新建一个该user的设备
                             device = create_new_device(user)
                     login(request, user)
-                    response = {'result': 'login successfully', 'token': device.token}
-                    return HttpResponse(json.dumps(response))
+                    response = {'token': device.token}
+                    return HttpResponse(json.dumps(response), status=200)
                 else:
-                    response = {'result': 'wrong account or password'}
-                    return HttpResponse(json.dumps(response))
+                    return HttpResponse(status=401)
         else:
-            response = {'result': 'illegal input'}
-            return HttpResponse(json.dumps(response))
+            return HttpResponse(status=400)
     # 用于测试,登录界面
     elif request.method == 'GET':
         if DEBUG:
@@ -85,8 +81,7 @@ def user_login(request):
             return render(request, 'login.html', context)
     else:
         # 请求方法错误,请使用POST
-        response = {'result': 'illegal method, please use post'}
-        return HttpResponse(json.dumps(response))
+        return HttpResponse(status=400)
 
 
 # 新建一个该user的设备
@@ -114,8 +109,7 @@ def generate_random_str(random_length=16):
 
 def user_logout(request):
     logout(request)
-    response = {'result': 'logout successfully'}
-    return HttpResponse(json.dumps(response))
+    return HttpResponse(status=200)
 
 
 def user_register(request):
@@ -128,11 +122,9 @@ def user_register(request):
             new_user.set_password(user_register_form.cleaned_data['password'])
             # 保存
             new_user.save()
-            response = {'result': 'reg successfully'}
-            return HttpResponse(json.dumps(response))
+            return HttpResponse(status=200)
         else:
-            response = {'result': 'illegal input'}
-            return HttpResponse(json.dumps(response))
+            return HttpResponse(status=400)
     # 用于测试
     elif request.method == 'GET':
         if DEBUG:
@@ -140,8 +132,7 @@ def user_register(request):
             context = {'form': user_register_form}
             return render(request, 'register.html', context)
     else:
-        response = {'result': 'illegal method, please use post'}
-        return HttpResponse(json.dumps(response))
+        return HttpResponse(status=400)
 
 
 @login_required(login_url='/account/login/')
@@ -151,8 +142,7 @@ def profile_edit(request, r_username):
     if request.method == 'POST':
         # 判断此用户是否正在修改自身账号信息
         if request.user != user:
-            response = {'result': 'You do not have permission to do this'}
-            return HttpResponse(json.dumps(response))
+            return HttpResponse(status=403)
         profile_form = ProfileForm(request.POST, request.FILES)
         if profile_form.is_valid():
             # 填入信息
@@ -162,11 +152,9 @@ def profile_edit(request, r_username):
             if 'avatar' in request.FILES:
                 profile.avatar = profile_cd["avatar"]
             profile.save()
-            response = {'result': 'edit successfully'}
-            return HttpResponse(json.dumps(response))
+            return HttpResponse(status=200)
         else:
-            response = {'result': 'illegal input'}
-            return HttpResponse(json.dumps(response))
+            return HttpResponse(status=400)
     # 用于测试
     elif request.method == 'GET':
         if DEBUG:
@@ -174,8 +162,7 @@ def profile_edit(request, r_username):
             context = {'profile_form': profile_form, 'profile': profile, 'user': user}
             return render(request, 'edit.html', context)
     else:
-        response = {'result': 'illegal method, please use post'}
-        return HttpResponse(json.dumps(response))
+        return HttpResponse(status=400)
 
 
 @login_required(login_url='/account/login/')
@@ -196,7 +183,7 @@ def profile_detail(request, r_username):
             response['avatar'] = profile.avatar.url
         else:
             response['avatar'] = ''
-        return HttpResponse(json.dumps(response))
+        return HttpResponse(json.dumps(response),status=200)
     # 用于测试
     elif request.method == 'GET':
         if DEBUG:
@@ -204,5 +191,4 @@ def profile_detail(request, r_username):
             context = {'profile_form': profile_form, 'profile': profile, 'user': user}
             return render(request, 'edit.html', context)
     else:
-        response = {'result': 'illegal method, please use post'}
-        return HttpResponse(json.dumps(response))
+        return HttpResponse(status=400)

BIN
db.sqlite3


+ 7 - 0
infrastructure/admin.py

@@ -1,3 +1,10 @@
 from django.contrib import admin
+from .models import PublicKey
+
 
 # Register your models here.
+class PublicKeyAdmin(admin.ModelAdmin):
+    list_display = ["user", "public_key"]
+
+
+admin.site.register(PublicKey, PublicKeyAdmin)

+ 4 - 5
infrastructure/form.py

@@ -1,10 +1,9 @@
 from django import forms
 from .models import PublicKey
+from django.contrib.auth.models import User
 
 
 class AddPublicKeyForm(forms.ModelForm):
-    public_key = forms.CharField()
-
-
-class GetPublicKeyForm(forms.ModelForm):
-    username = forms.CharField()
+    class Meta:
+        model = PublicKey
+        fields = ('public_key',)

+ 29 - 0
infrastructure/interface.md

@@ -0,0 +1,29 @@
+# 添加公钥
+******
+## 请求接口约定(均使用POST)
+
+接口链接:'infrastructure/add_public_key'
+
+public_key(必填)
+
+## 返回值接口约定
+***http状态码***
+
+200:请求成功
+
+400:请求不合法
+
+# 获取公钥
+******
+## 请求接口约定(均使用POST)
+
+接口链接:'infrastructure/get_public_key'
+
+username(必填)
+
+## 返回值接口约定
+***http状态码 公钥列表***
+
+200+json列表:成功+返回值
+
+400:请求不合法

+ 25 - 0
infrastructure/migrations/0001_initial.py

@@ -0,0 +1,25 @@
+# Generated by Django 3.2.5 on 2021-07-09 03:07
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='PublicKey',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('public_key', models.CharField(max_length=1025, unique=True)),
+                ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='public_key', to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+    ]

+ 0 - 0
infrastructure/migrations/__init__.py


+ 1 - 1
infrastructure/models.py

@@ -5,6 +5,6 @@ from django.contrib.auth.models import User
 # 公钥表
 class PublicKey(models.Model):
     # 对应django自带的user
-    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
+    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='public_key')
     # 公钥
     public_key = models.CharField(max_length=1025, blank=False, unique=True)

+ 15 - 0
infrastructure/templates/add_public_key.html

@@ -0,0 +1,15 @@
+<div>
+                <br>
+                <form method="post" action="." enctype="multipart/form-data">
+                    {% csrf_token %}
+                    <div>
+                        <label for="public_key">
+                            添加公钥
+                        </label>
+                        <input type="text" id="public_key" name="public_key">
+                    </div>
+                    <button type="submit">
+                        提交
+                    </button>
+                </form>
+    </div>

+ 15 - 0
infrastructure/templates/get_public_key.html

@@ -0,0 +1,15 @@
+<div>
+                <br>
+                <form method="post" action="." enctype="multipart/form-data">
+                    {% csrf_token %}
+                    <div>
+                        <label for="username">
+                            获得公钥
+                        </label>
+                        <input type="text" id="username" name="username">
+                    </div>
+                    <button type="submit">
+                        提交
+                    </button>
+                </form>
+    </div>

+ 7 - 0
infrastructure/urls.py

@@ -0,0 +1,7 @@
+from django.urls import path
+from . import views
+
+urlpatterns = [
+    path('add_public_key/', views.add_public_key, name='add_public_key'),
+    path('get_public_key/', views.get_public_key, name='get_public_key'),
+]

+ 20 - 27
infrastructure/views.py

@@ -5,28 +5,28 @@ from django.http import HttpResponse
 from django.contrib.auth.decorators import login_required
 import json
 
+DEBUG = True
+
 
 @login_required(login_url='/account/login/')
 def add_public_key(request):
     if request.method == 'POST':
         add_public_key_form = AddPublicKeyForm(data=request.POST)
         if add_public_key_form.is_valid():
+            # 新建公钥表
             data = add_public_key_form.cleaned_data
             new_public_key = PublicKey()
             new_public_key.public_key = data['public_key']
             new_public_key.user = request.user
             # 保存
             new_public_key.save()
-            response = ['public ket added']
-            return HttpResponse(json.dumps(response))
+            return HttpResponse(status=200)
         else:
-            response = ['illegal input']
-            return HttpResponse(json.dumps(response))
+            return HttpResponse(status=400)
     # 用于测试
-    # elif request.method == 'GET':
-    #     user_register_form = UserRegisterForm()
-    #     context = {'form': user_register_form}
-    #     return render(request, 'register.html', context)
+    elif request.method == 'GET':
+        if DEBUG:
+            return render(request, 'add_public_key.html')
     else:
         response = ['illegal method, please use post']
         return HttpResponse(json.dumps(response))
@@ -35,24 +35,17 @@ def add_public_key(request):
 @login_required(login_url='/account/login/')
 def get_public_key(request):
     if request.method == 'POST':
-        add_public_key_form = AddPublicKeyForm(data=request.POST)
-        if add_public_key_form.is_valid():
-            data = add_public_key_form.cleaned_data
-            new_public_key = PublicKey()
-            new_public_key.public_key = data['public_key']
-            new_public_key.user = request.user
-            # 保存
-            new_public_key.save()
-            response = ['public ket added']
-            return HttpResponse(json.dumps(response))
-        else:
-            response = ['illegal input']
-            return HttpResponse(json.dumps(response))
+        data = request.POST
+        # 筛选出此用户的公钥
+        public_keys = PublicKey.objects.filter(user__username=data['username'])
+        # 将筛选得到的此用户的公钥放入列表中并用json返回
+        response = []
+        for public_key in public_keys:
+            response.append(public_key.public_key)
+        return HttpResponse(json.dumps(response),status=200)
     # 用于测试
-    # elif request.method == 'GET':
-    #     user_register_form = UserRegisterForm()
-    #     context = {'form': user_register_form}
-    #     return render(request, 'register.html', context)
+    elif request.method == 'GET':
+        if DEBUG:
+            return render(request, 'get_public_key.html')
     else:
-        response = ['illegal method, please use post']
-        return HttpResponse(json.dumps(response))
+        return HttpResponse(status=400)