From 579db5e918dd0e9a3e7a6eae22c82936da15a3e8 Mon Sep 17 00:00:00 2001 From: cs10086 <1291454411@qq.com> Date: Sun, 5 Apr 2026 16:50:12 +0800 Subject: [PATCH] 1 --- .idea/workspace.xml | 96 +- api/4c9da042-07f7-4b23-8e8e-8db67cdad1a8.png | Bin 0 -> 16669 bytes api/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 158 bytes api/__pycache__/admin.cpython-312.pyc | Bin 0 -> 202 bytes api/__pycache__/apps.cpython-312.pyc | Bin 0 -> 458 bytes api/__pycache__/models.cpython-312.pyc | Bin 0 -> 199 bytes api/__pycache__/urls.cpython-312.pyc | Bin 0 -> 1184 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 169 bytes api/tests.py | 20 +- api/urls.py | 22 +- api/views/BaiduFanyiView.py | 211 ++- .../BaiduFanyiView.cpython-312.pyc | Bin 0 -> 11241 bytes .../__pycache__/GetIPDataView.cpython-312.pyc | Bin 0 -> 1817 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 164 bytes api/views/info/__init__.py | 0 .../info/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 169 bytes .../baidu_fanyi_appid.cpython-312.pyc | Bin 0 -> 296 bytes .../baidu_lang_info.cpython-312.pyc | Bin 0 -> 33480 bytes api/views/info/baidu_fanyi_appid.py | 4 + api/views/info/baidu_lang_info.py | 1184 +++++++++++++++++ app/__pycache__/apps.cpython-312.pyc | Bin 386 -> 447 bytes app/__pycache__/models.cpython-312.pyc | Bin 199 -> 156 bytes app/__pycache__/urls.cpython-312.pyc | Bin 0 -> 284 bytes .../__pycache__/asgi.cpython-312.pyc | Bin 0 -> 429 bytes .../__pycache__/settings.cpython-312.pyc | Bin 2509 -> 8145 bytes .../__pycache__/urls.cpython-312.pyc | Bin 1043 -> 1240 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 671 -> 0 bytes chunyu_project/settings.py | 166 ++- user/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 159 bytes user/__pycache__/admin.cpython-312.pyc | Bin 0 -> 203 bytes user/__pycache__/apps.cpython-312.pyc | Bin 0 -> 461 bytes user/__pycache__/models.cpython-312.pyc | Bin 0 -> 1113 bytes user/__pycache__/urls.cpython-312.pyc | Bin 0 -> 917 bytes user/migrations/0001_initial.py | 2 +- user/migrations/0002_fuser_issetpassword.py | 19 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 3971 bytes .../0002_fuser_issetpassword.cpython-312.pyc | Bin 0 -> 825 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 170 bytes user/models.py | 1 + user/urls.py | 10 +- user/views.py | 15 - user/views/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 165 bytes user/views/__pycache__/user.cpython-312.pyc | Bin 0 -> 3335 bytes user/views/user.py | 75 ++ utils/RandCode.py | 99 ++ utils/__pycache__/RandCode.cpython-312.pyc | Bin 0 -> 6409 bytes 47 files changed, 1853 insertions(+), 71 deletions(-) create mode 100644 api/4c9da042-07f7-4b23-8e8e-8db67cdad1a8.png create mode 100644 api/__pycache__/__init__.cpython-312.pyc create mode 100644 api/__pycache__/admin.cpython-312.pyc create mode 100644 api/__pycache__/apps.cpython-312.pyc create mode 100644 api/__pycache__/models.cpython-312.pyc create mode 100644 api/__pycache__/urls.cpython-312.pyc create mode 100644 api/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 api/views/__pycache__/BaiduFanyiView.cpython-312.pyc create mode 100644 api/views/__pycache__/GetIPDataView.cpython-312.pyc create mode 100644 api/views/__pycache__/__init__.cpython-312.pyc create mode 100644 api/views/info/__init__.py create mode 100644 api/views/info/__pycache__/__init__.cpython-312.pyc create mode 100644 api/views/info/__pycache__/baidu_fanyi_appid.cpython-312.pyc create mode 100644 api/views/info/__pycache__/baidu_lang_info.cpython-312.pyc create mode 100644 api/views/info/baidu_fanyi_appid.py create mode 100644 api/views/info/baidu_lang_info.py create mode 100644 app/__pycache__/urls.cpython-312.pyc create mode 100644 chunyu_project/__pycache__/asgi.cpython-312.pyc delete mode 100644 chunyu_project/__pycache__/wsgi.cpython-312.pyc create mode 100644 user/__pycache__/__init__.cpython-312.pyc create mode 100644 user/__pycache__/admin.cpython-312.pyc create mode 100644 user/__pycache__/apps.cpython-312.pyc create mode 100644 user/__pycache__/models.cpython-312.pyc create mode 100644 user/__pycache__/urls.cpython-312.pyc create mode 100644 user/migrations/0002_fuser_issetpassword.py create mode 100644 user/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 user/migrations/__pycache__/0002_fuser_issetpassword.cpython-312.pyc create mode 100644 user/migrations/__pycache__/__init__.cpython-312.pyc delete mode 100644 user/views.py create mode 100644 user/views/__init__.py create mode 100644 user/views/__pycache__/__init__.cpython-312.pyc create mode 100644 user/views/__pycache__/user.cpython-312.pyc create mode 100644 user/views/user.py create mode 100644 utils/RandCode.py create mode 100644 utils/__pycache__/RandCode.cpython-312.pyc diff --git a/.idea/workspace.xml b/.idea/workspace.xml index fb63dbe..d456bda 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,11 +5,22 @@ - + + + + + + + + - + + + + + - { + "keyToString": { + "Django 服务器.chunyu_project.executor": "Run", + "ModuleVcsDetector.initialDetectionPerformed": "true", + "Notification.DisplayName-DoNotAsk-DatabaseConfigFileWatcher.found": "发现新的/更新的数据库配置", + "Notification.DoNotAsk-DatabaseConfigFileWatcher.found": "true", + "Python.tests.executor": "Run", + "RunOnceActivity.MCP Project settings loaded": "true", + "RunOnceActivity.OpenDjangoStructureViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", + "RunOnceActivity.git.unshallow": "true", + "RunOnceActivity.typescript.service.memoryLimit.init": "true", + "git-widget-placeholder": "main", + "last_opened_file_path": "C:/Users/12914/PycharmProjects/chunyu_project/api", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable", + "vue.rearranger.settings.migration": "true" }, - "keyToStringList": { - "DatabaseDriversLRU": [ - "sqlite" + "keyToStringList": { + "DatabaseDriversLRU": [ + "sqlite" ] } -}]]> +} + - @@ -134,7 +145,12 @@ @@ -171,6 +203,6 @@ - + \ No newline at end of file diff --git a/api/4c9da042-07f7-4b23-8e8e-8db67cdad1a8.png b/api/4c9da042-07f7-4b23-8e8e-8db67cdad1a8.png new file mode 100644 index 0000000000000000000000000000000000000000..f860599fcb780f4410d3cc77177a290eed7c0c49 GIT binary patch literal 16669 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
    ~n4{(;q2&G|bwZxmA0Zo-xN2P}}pq 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 Niz~dVcw_Yb{{X)TM~DCb literal 0 HcmV?d00001 diff --git a/api/__pycache__/__init__.cpython-312.pyc b/api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54c9d71784ce5187212b6cdf9125089c25722752 GIT binary patch literal 158 zcmX@j%ge<81Vw>IGC}lX5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!vURqK2`x@7DvmKU zvNSY_38+lYNG!??D9X=DO)e>pNzN$Et1OK#fbe4y3o>Kk<1_OzOXB183My}L*yQG? bl;)(`6|n+MV+7)25aS~=BO_xGGmr%U12ZQO literal 0 HcmV?d00001 diff --git a/api/__pycache__/admin.cpython-312.pyc b/api/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4b6154c18f1a0db1081463174101423859b014f GIT binary patch literal 202 zcmX@j%ge<81Vw>IGM#|*V-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zZS zi7C06d48HqxA;=B67$mY^^)`RN{TX*ikN{4Rx*4BsrzN+Y!wq)oLW>IV`yY)Xc7}p znVgYWlp9c#pOuS$E2zB1VUwGmQks)$SHuA{iV=v5 SL5vT~jEs!;7!-=wfE)md#53Rk literal 0 HcmV?d00001 diff --git a/api/__pycache__/apps.cpython-312.pyc b/api/__pycache__/apps.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..716b080c65d75ac4dad8a6aa4f3d1c5872416fc5 GIT binary patch literal 458 zcmXv~Jxc>Y5S_idNIoTs2o@GL!ZimG3nL=Lh;|_sHpjto-fof$_vLP`I6EOfAYFcg z_&4lqEW?47m7Nf6tlYgl2X^MYee>9zd2O}oAcEbz_zO`#B>9g@3D$=KEP(()0ffj# z2sF3`qRoNm6g}&z&(<=-tb9shqP*5il71YG{IREGl~GC7I|3|$f{h5+8bP*BG~38@ z(~wqQSs(Vv)Q!fmMeeLHCN$vIg+K14v-rxV0m*eY@dsuluVNgzA;mbaV=NleK;kCG z_o*9{$~K`RHw|Xk6?Qx-{D#z?U@brO+wGq^x12KWbdI{6V`rFo6PJZU7Eh@+ kHwDV8XKIdf))rK*jmwpN=?I~BIQZVs(AJ{%1ELhJKe&B#5&!@I literal 0 HcmV?d00001 diff --git a/api/__pycache__/models.cpython-312.pyc b/api/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a772236598424d33506007dd3a188097d3d31a3b GIT binary patch literal 199 zcmX@j%ge<81Vw>IGHrnLV-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zYn zx%nxnImLdOOt&~wvJ&&s^Yv1aikN|tD;Yk6)cmq`wu%WYPAw{qF*LF?G>HkQOwLFw z$_*&W&q_@$DUM0bD9x)ZjW2-kV-gE8V<2Yg6;$5humQ45b5iY!IDlp`0&y{j@qw9< Nk?|gbOc5K90|3HfGM)ec literal 0 HcmV?d00001 diff --git a/api/__pycache__/urls.cpython-312.pyc b/api/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a04b3d54a8e7d630b7e5207c38c4bdc8434edd24 GIT binary patch literal 1184 zcma)5J#W)M7(P2rV#jg%0VNUGF$)rrB8Nfi zwvLDe_z9^00|pjH9wK=|sDf@q9V#(#mnNm@lpEfA?|GiP_qq3U-#IP^(75{ftNEJ* z;3r;820Km;KM(+X1Uk?O3)qBA5I83-(oV@Ko02KCPU)1Dwli{Ol&7t%P0O^+$c&wn zb2clpc3#fgoXin`1V&2FpqSa_C#C++yW?~hxxr(k&Z0=qtfrBgnOV&sb#7*L4yoCh z)htryXIAHtnwv%4$;xv*u2R^?4XO}HTGegSsgMcfsX;f%nvQ0Ly0MR*4b$8sBY50? zpa$wI(|A+KB!zpbsfQ0$r)Od$ncuLiC#utV(en%p_{qXX7`W5Wg=dE5b{w;BOyf&! zQwu_9oY2Q7EIs!OL+g&wz;qpq_j4WO#lv1|eRk`_My)@Gh*LId{do+Wa#8Cq!m|!) z{RQt#btLo8R<1p*%qInX8(qzQ_mHT&;m%aggW%>Hb za$RZnw5|&6HgvZQE$|hs8#=vk(>q=(s%I+LtmO3)x@o(5Xc=p;h)%+f?SDhzAVmdVkVR4Rp$HFCamw)9U BDc%48 literal 0 HcmV?d00001 diff --git a/api/migrations/__pycache__/__init__.cpython-312.pyc b/api/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d9939eca0b0aff941d8f71fc98196eadf10fc1e GIT binary patch literal 169 zcmX@j%ge<81Vw>IGC}lX5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!@^H3_2`x@7DvmKU zvNSY_38+lYNG!??D9X=DO)e>pNzN$Et1OK#fbe4y3o>JJGt-L_OEUBGieuvAGxIV_ m;^XxSDsOSvuWd1ma>4<0CU8BV!RWkOcrNbSty~ literal 0 HcmV?d00001 diff --git a/api/tests.py b/api/tests.py index 7ce503c..8f6ea3d 100644 --- a/api/tests.py +++ b/api/tests.py @@ -1,3 +1,19 @@ -from django.test import TestCase +# -*- coding=utf-8 +from qcloud_cos import CosConfig +from qcloud_cos import CosS3Client +import sys +import logging -# Create your tests here. +# 正常情况日志级别使用 INFO,需要定位时可以修改为 DEBUG,此时 SDK 会打印和服务端的通信信息 +logging.basicConfig(level=logging.INFO, stream=sys.stdout) + +# 1. 设置用户属性, 包括 secret_id, secret_key, region 等。Appid 已在 CosConfig 中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成 +secret_id = 'SecretId' # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi +secret_key = 'SecretKey' # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi +region = 'ap-beijing' # 替换为用户的 region,已创建桶归属的 region 可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket + # COS支持的所有 region 列表参见 https://cloud.tencent.com/document/product/436/6224 +token = None # 如果使用永久密钥不需要填入token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见 https://cloud.tencent.com/document/product/436/14048 +scheme = 'https' # 指定使用 http/https 协议来访问 COS,默认为 https,可不填 + +config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme) +client = CosS3Client(config) \ No newline at end of file diff --git a/api/urls.py b/api/urls.py index f45bf9e..02bea08 100644 --- a/api/urls.py +++ b/api/urls.py @@ -1,8 +1,28 @@ + from django.contrib import admin + from django.urls import path, include + from .views.GetIPDataView import GetIPDataView -from .views.BaiduFanyiView import BaiduFanyiView + +from .views.BaiduFanyiView import BaiduFanyiView, AllLangTypeViews, AutoLangTypeViews, RecognizeLangTypeViews, PictureRecognizeViews, SpeechRecognitionView + urlpatterns = [ + path("getIpData/", GetIPDataView.as_view()), + path("baiduFanyi/", BaiduFanyiView.as_view()), + + path("getAllLangType/", AllLangTypeViews.as_view()), + + path("getAutoLangType/", AutoLangTypeViews.as_view()), + + path("recognizeLangType/", RecognizeLangTypeViews.as_view()), + + path("pictureRecognize/", PictureRecognizeViews.as_view()), + + path("speechRecognition/", SpeechRecognitionView.as_view()), + + + ] \ No newline at end of file diff --git a/api/views/BaiduFanyiView.py b/api/views/BaiduFanyiView.py index a56a71c..fc6ce50 100644 --- a/api/views/BaiduFanyiView.py +++ b/api/views/BaiduFanyiView.py @@ -1,4 +1,8 @@ +from symtable import Class + +from django.core.signing import base64_hmac from rest_framework.decorators import permission_classes +from rest_framework.parsers import MultiPartParser, FormParser from rest_framework.permissions import AllowAny from rest_framework.views import APIView @@ -13,6 +17,12 @@ import random import json from hashlib import md5 +from twisted.scripts.htmlizer import header + +from .info.baidu_lang_info import languages, auto_lang + +from .info.baidu_fanyi_appid import appid, appkey, endpoint + def make_md5(s, encoding='utf-8'): return md5(s.encode(encoding)).hexdigest() @@ -20,21 +30,48 @@ def make_md5(s, encoding='utf-8'): @permission_classes([AllowAny]) class BaiduFanyiView(APIView): def post(self, request): + """ + + 请求参数为 q 翻译内容 文本长度限制3000字以下 + from_lang 原语言 + to_lang 翻译语言 (支持 auto 为自动识别) + + + :param request: + :return: + """ print(request.data) # Set your own appid/appkey. - appid = '20220718001275847' - appkey = 'CJHmvf7qGs3szQy32cMg' - from_lang = 'en' - to_lang = 'zh' - endpoint = 'http://api.fanyi.baidu.com' + from_lang = request.data.get('from_lang') + to_lang = request.data.get('to_lang') + + if (from_lang not in languages) or (to_lang not in languages) or (to_lang == "auto"): + return Response( + { + "message": "翻译语种异常" + }, + status=status.HTTP_400_BAD_REQUEST + ) + + if from_lang == to_lang: + return Response( + { + "message": "翻译数据异常" + } + ) + path = '/api/trans/vip/translate' url = endpoint + path query = request.data['q'] + if len(query) > 3000: + return Response({"请求数据长度过长已经超过3000."}, status=status.HTTP_400_BAD_REQUEST) + + salt = random.randint(32768, 65536) sign = make_md5(appid + query + str(salt) + appkey) @@ -44,5 +81,169 @@ class BaiduFanyiView(APIView): r = requests.post(url, params=payload, headers=headers) result = r.json() + return Response(result, status=status.HTTP_200_OK) +@permission_classes([AllowAny]) +class AutoLangTypeViews(APIView): # 获取可用自动识别的所有语言类型 + def get(self, request): + return Response(auto_lang, status=status.HTTP_200_OK) + +@permission_classes([AllowAny]) +class AllLangTypeViews(APIView): # 获取可用自动识别的所有语言类型 + def get(self, request): + return Response(languages, status=status.HTTP_200_OK) + + +@permission_classes([AllowAny]) +class RecognizeLangTypeViews(APIView): # 文本语种识别 + """ + + 请求参数为 q 翻译内容 文本长度限制3000字以下 + + :param request: + :return: + """ + def post(self, request): + + path = '/api/trans/vip/language' + url = endpoint + path + + query = request.data.get("q") + + if len(query) > 3000: + return Response({"请求数据长度过长已经超过3000."}, status=status.HTTP_400_BAD_REQUEST) + + salt = random.randint(32768, 65536) + sign = make_md5(appid + query + str(salt) + appkey) + + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + payload = {'appid': appid, 'q': query, 'salt': salt, 'sign': sign} + + r = requests.post(url, params=payload, headers=headers) + result = r.json() + + code = result.get('error_code') + + if code == 0: + return Response(result, status=status.HTTP_200_OK) + elif code == 54009: + return Response({ + "message": "不在课识别语种范围." + }, status=status.HTTP_400_BAD_REQUEST) + else : + return Response({ + "message": "其他问题请联系管理员." + }, status=status.HTTP_400_BAD_REQUEST) + +import requests +import random +from hashlib import md5 + +from .info.baidu_fanyi_appid import appid as app_id, appkey as app_key + +from .info.baidu_lang_info import cuid, mac, p_code, p_lang_type + +@permission_classes([AllowAny]) +class PictureRecognizeViews(APIView): # 图片翻译 + + parser_classes = [MultiPartParser, FormParser] + + def post(self, request): + + file_data = request.FILES['file'].read() + + path = '/api/trans/sdk/picture' + url = endpoint + path + + from_lang = request.GET.get("from_lang") + to_lang = request.GET.get("to_lang") + picture_type = request.GET.get("picture") + + if (from_lang == to_lang) or (to_lang == "auto"): + return Response({"message": "翻译数据错误."}, status=status.HTTP_400_BAD_REQUEST) + if (from_lang not in p_lang_type.keys()) or (to_lang not in p_lang_type.keys()) : + return Response({"message": "翻译语种异常."}, status=status.HTTP_400_BAD_REQUEST) + + def get_md5(string, encoding='utf-8'): + return md5(string.encode(encoding)).hexdigest() + + salt = random.randint(32768, 65536) + sign = get_md5(app_id + md5(file_data).hexdigest() + str(salt) + cuid + mac + app_key) + + payload = {'from': from_lang, 'to': to_lang, 'appid': app_id, 'salt': salt, 'sign': sign, 'cuid': cuid, + 'mac': mac} + image = {'image': (f"p_image.{ picture_type }", file_data, "multipart/form-data")} + + response = requests.post(url, params=payload, files=image) + result = response.json() + + if result['error_code'] == 0: + return Response(result, status=status.HTTP_200_OK) + else: + result = p_code[result['error_code']] + return Response(result, status=status.HTTP_400_BAD_REQUEST) + +from .info.baidu_lang_info import y_speech_type, pcm_y_lang_type, y_lang_type + +import time + +import hmac +import hashlib +import base64 + + +@permission_classes([AllowAny]) +class SpeechRecognitionView(APIView): + + parser_classes = [MultiPartParser, FormParser] + + def post(self, request): + speech_type = request.GET.get("speech_type") + + if speech_type not in y_speech_type: + return Response({"message": "不支持的语音类型."}, status=status.HTTP_400_BAD_REQUEST) + + from_lang = request.GET.get('from_lang') + to_lang = request.GET.get('to_lang') + + if (from_lang == to_lang) or (to_lang == "auto"): + return Response({"message": "翻译数据错误."}, status=status.HTTP_400_BAD_REQUEST) + + + if (from_lang not in (pcm_y_lang_type.keys() if speech_type == "pcm" else y_lang_type.keys())) or (to_lang not in (pcm_y_lang_type.keys() if speech_type == "pcm" else y_lang_type.keys())): + return Response({"message": "翻译语种异常."}, status=status.HTTP_400_BAD_REQUEST) + + voice = request.FILES.get("voice").read() + + base64_hmac_voice = base64.b64encode(voice).decode('utf-8') + + timestamp = str(int(time.time())) + + path = "/api/trans/v2/voicetrans" + + url = endpoint + path + + msg = appid + timestamp + base64_hmac_voice + sign = base64.b64encode(hmac.new(app_key.encode("utf-8"), msg.encode("utf-8"), digestmod=hashlib.sha256).digest()) + + print(sign) + + headers = { + "Content-Type": "application/json", + "X-Appid": app_id, + "X-Timestamp": timestamp, + "X-Sign": sign, + "X-EncryptType": "hmac256" + } + + data = { + "format": speech_type, + "voice": base64_hmac_voice, + "to": to_lang, + "from": from_lang, + } + + response = requests.post(url, headers = headers,data = data) + + result = response.json() return Response(result, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/api/views/__pycache__/BaiduFanyiView.cpython-312.pyc b/api/views/__pycache__/BaiduFanyiView.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbdc3a7090941b692cd5aca4614364b812e61b7c GIT binary patch literal 11241 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≧W`nTfyvUAapc+ zINc7+Hv{vH_u{QU;+kA%H(jr|zji)<6^x93bL+c!V|@Cj`|ZVeb20wxMxvo4x_tLw zJ!E4FLS?mt5n^tHN)@f93+zScQBBo*95P$Bj}*XFe+VJ}Gd z*Fzq5i}1@qTZAvLTOpr@HC(6=)u<3k#AUIuD}M7Dh)uX&yW--i`A?fqf(>8x_MXV= zmyO|zzn>DZ$KJMY3v_-IrmXZ1{XTh@JH!`Hm$~>yh7fkZQU?S(V7dd|>VTOu2av}0 dAMAhJf^R;ThF}uz$GbqxT^UIJGt*?I{vT<_uHygz literal 0 HcmV?d00001 diff --git a/api/views/__pycache__/__init__.cpython-312.pyc b/api/views/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d019e3570538703707bfd22b949c3fc09b2ffd3 GIT binary patch literal 164 zcmX@j%ge<81Z53JGePuY5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!a(1?g2`x@7DvmKU zvNSY_38+lYNG!??D9X=DO)e>pNzN$Et1OK#fbe4y3o>KMGE>WoW8&j8^D;}~71<6Iz^FR2*Yy zWNBy;6Hu9)kyw-)P?VpQnp{#GlblhSS6Lcg0O7|Z7G%bhWu}%F$7JTE<;TRwXXa&= m#K-FuRNmsS$<0qG%}KQ@Vg(w^2*kx8#z$sGM#ds$APWFzVJr*) literal 0 HcmV?d00001 diff --git a/api/views/info/__pycache__/baidu_fanyi_appid.cpython-312.pyc b/api/views/info/__pycache__/baidu_fanyi_appid.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fac5ad08dc1cf0ab1453701d06c6e683e3227925 GIT binary patch literal 296 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 z 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 V#Q(OcYxQFO(EQYYfPXRT{{oYM3$FkG literal 0 HcmV?d00001 diff --git a/api/views/info/baidu_fanyi_appid.py b/api/views/info/baidu_fanyi_appid.py new file mode 100644 index 0000000..f0cb899 --- /dev/null +++ b/api/views/info/baidu_fanyi_appid.py @@ -0,0 +1,4 @@ +appid = '20220718001275847' +appkey = 'CJHmvf7qGs3szQy32cMg' + +endpoint = 'http://api.fanyi.baidu.com' \ No newline at end of file diff --git a/api/views/info/baidu_lang_info.py b/api/views/info/baidu_lang_info.py new file mode 100644 index 0000000..695fe83 --- /dev/null +++ b/api/views/info/baidu_lang_info.py @@ -0,0 +1,1184 @@ +# 图片识别支持类型 +cuid = 'APICUID' +mac = 'mac' + +p_lang_type = { + "zh": "中文", + "en": "英语", + "jp": "日语", + "kor": "韩语", + "fra": "法语", + "spa": "西班牙语", + "ru": "俄语", + "pt": "葡萄牙语", + "de": "德语", + "it": "意大利语", + "dan": "丹麦语", + "nl": "荷兰语", + "may": "马来语", + "swe": "瑞典语", + "id": "印尼语", + "pl": "波兰语", + "rom": "罗马尼亚语", + "tr": "土耳其语", + "el": "希腊语", + "hu": "匈牙利语", + "auto": "自动识别" +} + + + +p_code = { + "0": {"code": "0", "message": "成功"}, + "52001": {"code": "52001", "message": "请求超时"}, + "52002": {"code": "52002", "message": "服务端系统错误"}, + "52003": {"code": "52003", "message": "未授权用户"}, + "52010": {"code": "52010", "message": "开放设备授权容量不足"}, + "54000": {"code": "54000", "message": "必填参数为空或固定参数有误"}, + "54001": {"code": "54001", "message": "签名错误"}, + "54003": {"code": "54003", "message": "访问频率受限"}, + "54004": {"code": "54004", "message": "账户余额不足"}, + "54005": {"code": "54005", "message": "长query请求频繁"}, + "58000": {"code": "58000", "message": "客户端IP非法"}, + "58001": {"code": "58001", "message": "译文语言方向不支持"}, + "69001": {"code": "69001", "message": "上传图片数据有误"}, + "69002": {"code": "69002", "message": "图片识别超时"}, + "69003": {"code": "69003", "message": "内容识别失败"}, + "69004": {"code": "69004", "message": "识别内容为空"}, + "69005": {"code": "69005", "message": "图片大小超限(超过4M)"}, + "69006": {"code": "69006", "message": "图片尺寸不符合标准(最短边至少30px,最长边最大4096px)"}, + "69007": {"code": "69007", "message": "图片格式不支持(png/jpg)"}, + "69008": {"code": "69008", "message": "设备号为空"}, + "69012": {"code": "69012", "message": "文字贴合参数异常"} +} + +# 语音识别翻译 +y_lang_type = {'zh': '中文', 'en': '英语', 'jp': '日语', 'kor': '韩语', 'yue': '粤语', 'ru': '俄语', 'de': '德语', 'fra': '法语', 'th': '泰语', 'pt': '葡萄牙语', 'spa': '西班牙语', 'ara': '阿拉伯语(巴林)'} + +pcm_y_lang_type = {'zh': '中文', 'yue': '粤语'} + +y_speech_type = ["pcm", "wav", "amr", "m4a"] # 最多支持的语音类型 + + +# 通用文本翻译 +languages = {'ara': {'name': '阿拉伯语', 'code': 'ara', 'detect': True}, 'gle': {'name': '爱尔兰语', 'code': 'gle', 'detect': True}, 'oci': {'name': '奥克语', 'code': 'oci', 'detect': True}, 'alb': {'name': '阿尔巴尼亚语', 'code': 'alb', 'detect': True}, 'arq': {'name': '阿尔及利亚阿拉伯语', 'code': 'arq', 'detect': False}, 'aka': {'name': '阿肯语', 'code': 'aka', 'detect': False}, 'arg': {'name': '阿拉贡语', 'code': 'arg', 'detect': False}, 'amh': {'name': '阿姆哈拉语', 'code': 'amh', 'detect': True}, 'asm': {'name': '阿萨姆语', 'code': 'asm', 'detect': True}, 'aym': {'name': '艾马拉语', 'code': 'aym', 'detect': False}, 'aze': {'name': '阿塞拜疆语', 'code': 'aze', 'detect': True}, 'ast': {'name': '阿斯图里亚斯语', 'code': 'ast', 'detect': True}, 'oss': {'name': '奥塞梯语', 'code': 'oss', 'detect': False}, 'est': {'name': '爱沙尼亚语', 'code': 'est', 'detect': True}, 'oji': {'name': '奥杰布瓦语', 'code': 'oji', 'detect': False}, 'ori': {'name': '奥里亚语', 'code': 'ori', 'detect': True}, 'orm': {'name': '奥罗莫语', 'code': 'orm', 'detect': False}, 'pl': {'name': '波兰语', 'code': 'pl', 'detect': True}, 'per': {'name': '波斯语', 'code': 'per', 'detect': True}, 'bre': {'name': '布列塔尼语', 'code': 'bre', 'detect': True}, 'bak': {'name': '巴什基尔语', 'code': 'bak', 'detect': False}, 'baq': {'name': '巴斯克语', 'code': 'baq', 'detect': True}, 'pot': {'name': '巴西葡萄牙语', 'code': 'pot', 'detect': False}, 'bel': {'name': '白俄罗斯语', 'code': 'bel', 'detect': True}, 'ber': {'name': '柏柏尔语', 'code': 'ber', 'detect': True}, 'pam': {'name': '邦板牙语', 'code': 'pam', 'detect': False}, 'bul': {'name': '保加利亚语', 'code': 'bul', 'detect': True}, 'sme': {'name': '北方萨米语', 'code': 'sme', 'detect': False}, 'ped': {'name': '北索托语', 'code': 'ped', 'detect': False}, 'bem': {'name': '本巴语', 'code': 'bem', 'detect': False}, 'bli': {'name': '比林语', 'code': 'bli', 'detect': False}, 'bis': {'name': '比斯拉马语', 'code': 'bis', 'detect': False}, 'bal': {'name': '俾路支语', 'code': 'bal', 'detect': False}, 'ice': {'name': '冰岛语', 'code': 'ice', 'detect': True}, 'bos': {'name': '波斯尼亚语', 'code': 'bos', 'detect': True}, 'bho': {'name': '博杰普尔语', 'code': 'bho', 'detect': False}, 'chv': {'name': '楚瓦什语', 'code': 'chv', 'detect': False}, 'tso': {'name': '聪加语', 'code': 'tso', 'detect': False}, 'dan': {'name': '丹麦语', 'code': 'dan', 'detect': True}, 'de': {'name': '德语', 'code': 'de', 'detect': True}, 'tat': {'name': '鞑靼语', 'code': 'tat', 'detect': True}, 'sha': {'name': '掸语', 'code': 'sha', 'detect': False}, 'tet': {'name': '德顿语', 'code': 'tet', 'detect': False}, 'div': {'name': '迪维希语', 'code': 'div', 'detect': False}, 'log': {'name': '低地德语', 'code': 'log', 'detect': True}, 'ru': {'name': '俄语', 'code': 'ru', 'detect': True}, 'fra': {'name': '法语', 'code': 'fra', 'detect': True}, 'fil': {'name': '菲律宾语', 'code': 'fil', 'detect': True}, 'fin': {'name': '芬兰语', 'code': 'fin', 'detect': True}, 'san': {'name': '梵语', 'code': 'san', 'detect': False}, 'fri': {'name': '弗留利语', 'code': 'fri', 'detect': False}, 'ful': {'name': '富拉尼语', 'code': 'ful', 'detect': False}, 'fao': {'name': '法罗语', 'code': 'fao', 'detect': False}, 'gla': {'name': '盖尔语', 'code': 'gla', 'detect': False}, 'kon': {'name': '刚果语', 'code': 'kon', 'detect': False}, 'ups': {'name': '高地索布语', 'code': 'ups', 'detect': False}, 'hkm': {'name': '高棉语', 'code': 'hkm', 'detect': True}, 'kal': {'name': '格陵兰语', 'code': 'kal', 'detect': False}, 'geo': {'name': '格鲁吉亚语', 'code': 'geo', 'detect': True}, 'guj': {'name': '古吉拉特语', 'code': 'guj', 'detect': True}, 'gra': {'name': '古希腊语', 'code': 'gra', 'detect': False}, 'eno': {'name': '古英语', 'code': 'eno', 'detect': False}, 'grn': {'name': '瓜拉尼语', 'code': 'grn', 'detect': False}, 'kor': {'name': '韩语', 'code': 'kor', 'detect': True}, 'nl': {'name': '荷兰语', 'code': 'nl', 'detect': True}, 'hup': {'name': '胡帕语', 'code': 'hup', 'detect': False}, 'hak': {'name': '哈卡钦语', 'code': 'hak', 'detect': False}, 'ht': {'name': '海地语', 'code': 'ht', 'detect': False}, 'mot': {'name': '黑山语', 'code': 'mot', 'detect': False}, 'hau': {'name': '豪萨语', 'code': 'hau', 'detect': False}, 'kir': {'name': '吉尔吉斯语', 'code': 'kir', 'detect': False}, 'glg': {'name': '加利西亚语', 'code': 'glg', 'detect': True}, 'frn': {'name': '加拿大法语', 'code': 'frn', 'detect': False}, 'cat': {'name': '加泰罗尼亚语', 'code': 'cat', 'detect': True}, 'cs': {'name': '捷克语', 'code': 'cs', 'detect': True}, 'kab': {'name': '卡拜尔语', 'code': 'kab', 'detect': True}, 'kan': {'name': '卡纳达语', 'code': 'kan', 'detect': True}, 'kau': {'name': '卡努里语', 'code': 'kau', 'detect': False}, 'kah': {'name': '卡舒比语', 'code': 'kah', 'detect': False}, 'cor': {'name': '康瓦尔语', 'code': 'cor', 'detect': False}, 'xho': {'name': '科萨语', 'code': 'xho', 'detect': True}, 'cos': {'name': '科西嘉语', 'code': 'cos', 'detect': False}, 'cre': {'name': '克里克语', 'code': 'cre', 'detect': False}, 'cri': {'name': '克里米亚鞑靼语', 'code': 'cri', 'detect': False}, 'kli': {'name': '克林贡语', 'code': 'kli', 'detect': False}, 'hrv': {'name': '克罗地亚语', 'code': 'hrv', 'detect': True}, 'que': {'name': '克丘亚语', 'code': 'que', 'detect': False}, 'kas': {'name': '克什米尔语', 'code': 'kas', 'detect': False}, 'kok': {'name': '孔卡尼语', 'code': 'kok', 'detect': False}, 'kur': {'name': '库尔德语', 'code': 'kur', 'detect': True}, 'lat': {'name': '拉丁语', 'code': 'lat', 'detect': True}, 'lao': {'name': '老挝语', 'code': 'lao', 'detect': False}, 'rom': {'name': '罗马尼亚语', 'code': 'rom', 'detect': True}, 'lag': {'name': '拉特加莱语', 'code': 'lag', 'detect': False}, 'lav': {'name': '拉脱维亚语', 'code': 'lav', 'detect': True}, 'lim': {'name': '林堡语', 'code': 'lim', 'detect': False}, 'lin': {'name': '林加拉语', 'code': 'lin', 'detect': False}, 'lug': {'name': '卢干达语', 'code': 'lug', 'detect': False}, 'ltz': {'name': '卢森堡语', 'code': 'ltz', 'detect': False}, 'ruy': {'name': '卢森尼亚语', 'code': 'ruy', 'detect': False}, 'kin': {'name': '卢旺达语', 'code': 'kin', 'detect': True}, 'lit': {'name': '立陶宛语', 'code': 'lit', 'detect': True}, 'roh': {'name': '罗曼什语', 'code': 'roh', 'detect': False}, 'ro': {'name': '罗姆语', 'code': 'ro', 'detect': False}, 'loj': {'name': '逻辑语', 'code': 'loj', 'detect': False}, 'may': {'name': '马来语', 'code': 'may', 'detect': True}, 'bur': {'name': '缅甸语', 'code': 'bur', 'detect': True}, 'mar': {'name': '马拉地语', 'code': 'mar', 'detect': False}, 'mg': {'name': '马拉加斯语', 'code': 'mg', 'detect': True}, 'mal': {'name': '马拉雅拉姆语', 'code': 'mal', 'detect': True}, 'mac': {'name': '马其顿语', 'code': 'mac', 'detect': True}, 'mah': {'name': '马绍尔语', 'code': 'mah', 'detect': False}, 'mai': {'name': '迈蒂利语', 'code': 'mai', 'detect': True}, 'glv': {'name': '曼克斯语', 'code': 'glv', 'detect': False}, 'mau': {'name': '毛里求斯克里奥尔语', 'code': 'mau', 'detect': False}, 'mao': {'name': '毛利语', 'code': 'mao', 'detect': False}, 'ben': {'name': '孟加拉语', 'code': 'ben', 'detect': True}, 'mlt': {'name': '马耳他语', 'code': 'mlt', 'detect': True}, 'hmn': {'name': '苗语', 'code': 'hmn', 'detect': False}, 'nor': {'name': '挪威语', 'code': 'nor', 'detect': True}, 'nea': {'name': '那不勒斯语', 'code': 'nea', 'detect': False}, 'nbl': {'name': '南恩德贝莱语', 'code': 'nbl', 'detect': False}, 'afr': {'name': '南非荷兰语', 'code': 'afr', 'detect': True}, 'sot': {'name': '南索托语', 'code': 'sot', 'detect': False}, 'nep': {'name': '尼泊尔语', 'code': 'nep', 'detect': True}, 'pt': {'name': '葡萄牙语', 'code': 'pt', 'detect': True}, 'pan': {'name': '旁遮普语', 'code': 'pan', 'detect': True}, 'pap': {'name': '帕皮阿门托语', 'code': 'pap', 'detect': False}, 'pus': {'name': '普什图语', 'code': 'pus', 'detect': False}, 'nya': {'name': '齐切瓦语', 'code': 'nya', 'detect': False}, 'twi': {'name': '契维语', 'code': 'twi', 'detect': False}, 'chr': {'name': '切罗基语', 'code': 'chr', 'detect': False}, 'jp': {'name': '日语', 'code': 'jp', 'detect': True}, 'swe': {'name': '瑞典语', 'code': 'swe', 'detect': True}, 'srd': {'name': '萨丁尼亚语', 'code': 'srd', 'detect': False}, 'sm': {'name': '萨摩亚语', 'code': 'sm', 'detect': False}, 'sec': {'name': '塞尔维亚-克罗地亚语', 'code': 'sec', 'detect': False}, 'srp': {'name': '塞尔维亚语', 'code': 'srp', 'detect': True}, 'sol': {'name': '桑海语', 'code': 'sol', 'detect': False}, 'sin': {'name': '僧伽罗语', 'code': 'sin', 'detect': True}, 'epo': {'name': '世界语', 'code': 'epo', 'detect': True}, 'nob': {'name': '书面挪威语', 'code': 'nob', 'detect': True}, 'sk': {'name': '斯洛伐克语', 'code': 'sk', 'detect': True}, 'slo': {'name': '斯洛文尼亚语', 'code': 'slo', 'detect': True}, 'swa': {'name': '斯瓦希里语', 'code': 'swa', 'detect': True}, 'src': {'name': '塞尔维亚语(西里尔)', 'code': 'src', 'detect': False}, 'som': {'name': '索马里语', 'code': 'som', 'detect': True}, 'sco': {'name': '苏格兰语', 'code': 'sco', 'detect': False}, 'th': {'name': '泰语', 'code': 'th', 'detect': True}, 'tr': {'name': '土耳其语', 'code': 'tr', 'detect': True}, 'tgk': {'name': '塔吉克语', 'code': 'tgk', 'detect': True}, 'tam': {'name': '泰米尔语', 'code': 'tam', 'detect': True}, 'tgl': {'name': '他加禄语', 'code': 'tgl', 'detect': True}, 'tir': {'name': '提格利尼亚语', 'code': 'tir', 'detect': False}, 'tel': {'name': '泰卢固语', 'code': 'tel', 'detect': True}, 'tua': {'name': '突尼斯阿拉伯语', 'code': 'tua', 'detect': False}, 'tuk': {'name': '土库曼语', 'code': 'tuk', 'detect': False}, 'ukr': {'name': '乌克兰语', 'code': 'ukr', 'detect': True}, 'wln': {'name': '瓦隆语', 'code': 'wln', 'detect': True}, 'wel': {'name': '威尔士语', 'code': 'wel', 'detect': True}, 'ven': {'name': '文达语', 'code': 'ven', 'detect': False}, 'wol': {'name': '沃洛夫语', 'code': 'wol', 'detect': False}, 'urd': {'name': '乌尔都语', 'code': 'urd', 'detect': True}, 'spa': {'name': '西班牙语', 'code': 'spa', 'detect': True}, 'heb': {'name': '希伯来语', 'code': 'heb', 'detect': True}, 'el': {'name': '希腊语', 'code': 'el', 'detect': True}, 'hu': {'name': '匈牙利语', 'code': 'hu', 'detect': True}, 'fry': {'name': '西弗里斯语', 'code': 'fry', 'detect': True}, 'sil': {'name': '西里西亚语', 'code': 'sil', 'detect': False}, 'hil': {'name': '希利盖农语', 'code': 'hil', 'detect': False}, 'los': {'name': '下索布语', 'code': 'los', 'detect': False}, 'haw': {'name': '夏威夷语', 'code': 'haw', 'detect': False}, 'nno': {'name': '新挪威语', 'code': 'nno', 'detect': True}, 'nqo': {'name': '西非书面语', 'code': 'nqo', 'detect': False}, 'snd': {'name': '信德语', 'code': 'snd', 'detect': False}, 'sna': {'name': '修纳语', 'code': 'sna', 'detect': False}, 'ceb': {'name': '宿务语', 'code': 'ceb', 'detect': False}, 'syr': {'name': '叙利亚语', 'code': 'syr', 'detect': False}, 'sun': {'name': '巽他语', 'code': 'sun', 'detect': False}, 'en': {'name': '英语', 'code': 'en', 'detect': True}, 'hi': {'name': '印地语', 'code': 'hi', 'detect': True}, 'id': {'name': '印尼语', 'code': 'id', 'detect': True}, 'it': {'name': '意大利语', 'code': 'it', 'detect': True}, 'vie': {'name': '越南语', 'code': 'vie', 'detect': True}, 'yid': {'name': '意第绪语', 'code': 'yid', 'detect': False}, 'ina': {'name': '因特语', 'code': 'ina', 'detect': False}, 'ach': {'name': '亚齐语', 'code': 'ach', 'detect': False}, 'ing': {'name': '印古什语', 'code': 'ing', 'detect': False}, 'ibo': {'name': '伊博语', 'code': 'ibo', 'detect': False}, 'ido': {'name': '伊多语', 'code': 'ido', 'detect': False}, 'yor': {'name': '约鲁巴语', 'code': 'yor', 'detect': False}, 'arm': {'name': '亚美尼亚语', 'code': 'arm', 'detect': True}, 'iku': {'name': '伊努克提图特语', 'code': 'iku', 'detect': False}, 'zh': {'name': '中文(简体)', 'code': 'zh', 'detect': True}, 'cht': {'name': '中文(繁体)', 'code': 'cht', 'detect': True}, 'wyw': {'name': '中文(文言文)', 'code': 'wyw', 'detect': True}, 'yue': {'name': '中文(粤语)', 'code': 'yue', 'detect': True}, 'zaz': {'name': '扎扎其语', 'code': 'zaz', 'detect': False}, 'frm': {'name': '中古法语', 'code': 'frm', 'detect': False}, 'zul': {'name': '祖鲁语', 'code': 'zul', 'detect': False}, 'jav': {'name': '爪哇语', 'code': 'jav', 'detect': False}, 'auto': {'name': '自动检测', 'code': 'auto', 'detect': True}} +auto_lang = {'ara': {'name': '阿拉伯语', 'code': 'ara', 'detect': True}, 'gle': {'name': '爱尔兰语', 'code': 'gle', 'detect': True}, 'oci': {'name': '奥克语', 'code': 'oci', 'detect': True}, 'alb': {'name': '阿尔巴尼亚语', 'code': 'alb', 'detect': True}, 'amh': {'name': '阿姆哈拉语', 'code': 'amh', 'detect': True}, 'asm': {'name': '阿萨姆语', 'code': 'asm', 'detect': True}, 'aze': {'name': '阿塞拜疆语', 'code': 'aze', 'detect': True}, 'ast': {'name': '阿斯图里亚斯语', 'code': 'ast', 'detect': True}, 'est': {'name': '爱沙尼亚语', 'code': 'est', 'detect': True}, 'ori': {'name': '奥里亚语', 'code': 'ori', 'detect': True}, 'pl': {'name': '波兰语', 'code': 'pl', 'detect': True}, 'per': {'name': '波斯语', 'code': 'per', 'detect': True}, 'bre': {'name': '布列塔尼语', 'code': 'bre', 'detect': True}, 'baq': {'name': '巴斯克语', 'code': 'baq', 'detect': True}, 'bel': {'name': '白俄罗斯语', 'code': 'bel', 'detect': True}, 'ber': {'name': '柏柏尔语', 'code': 'ber', 'detect': True}, 'bul': {'name': '保加利亚语', 'code': 'bul', 'detect': True}, 'ice': {'name': '冰岛语', 'code': 'ice', 'detect': True}, 'bos': {'name': '波斯尼亚语', 'code': 'bos', 'detect': True}, 'dan': {'name': '丹麦语', 'code': 'dan', 'detect': True}, 'de': {'name': '德语', 'code': 'de', 'detect': True}, 'tat': {'name': '鞑靼语', 'code': 'tat', 'detect': True}, 'log': {'name': '低地德语', 'code': 'log', 'detect': True}, 'ru': {'name': '俄语', 'code': 'ru', 'detect': True}, 'fra': {'name': '法语', 'code': 'fra', 'detect': True}, 'fil': {'name': '菲律宾语', 'code': 'fil', 'detect': True}, 'fin': {'name': '芬兰语', 'code': 'fin', 'detect': True}, 'hkm': {'name': '高棉语', 'code': 'hkm', 'detect': True}, 'geo': {'name': '格鲁吉亚语', 'code': 'geo', 'detect': True}, 'guj': {'name': '古吉拉特语', 'code': 'guj', 'detect': True}, 'kor': {'name': '韩语', 'code': 'kor', 'detect': True}, 'nl': {'name': '荷兰语', 'code': 'nl', 'detect': True}, 'glg': {'name': '加利西亚语', 'code': 'glg', 'detect': True}, 'cat': {'name': '加泰罗尼亚语', 'code': 'cat', 'detect': True}, 'cs': {'name': '捷克语', 'code': 'cs', 'detect': True}, 'kab': {'name': '卡拜尔语', 'code': 'kab', 'detect': True}, 'kan': {'name': '卡纳达语', 'code': 'kan', 'detect': True}, 'xho': {'name': '科萨语', 'code': 'xho', 'detect': True}, 'hrv': {'name': '克罗地亚语', 'code': 'hrv', 'detect': True}, 'kur': {'name': '库尔德语', 'code': 'kur', 'detect': True}, 'lat': {'name': '拉丁语', 'code': 'lat', 'detect': True}, 'rom': {'name': '罗马尼亚语', 'code': 'rom', 'detect': True}, 'lav': {'name': '拉脱维亚语', 'code': 'lav', 'detect': True}, 'kin': {'name': '卢旺达语', 'code': 'kin', 'detect': True}, 'lit': {'name': '立陶宛语', 'code': 'lit', 'detect': True}, 'may': {'name': '马来语', 'code': 'may', 'detect': True}, 'bur': {'name': '缅甸语', 'code': 'bur', 'detect': True}, 'mg': {'name': '马拉加斯语', 'code': 'mg', 'detect': True}, 'mal': {'name': '马拉雅拉姆语', 'code': 'mal', 'detect': True}, 'mac': {'name': '马其顿语', 'code': 'mac', 'detect': True}, 'mai': {'name': '迈蒂利语', 'code': 'mai', 'detect': True}, 'ben': {'name': '孟加拉语', 'code': 'ben', 'detect': True}, 'mlt': {'name': '马耳他语', 'code': 'mlt', 'detect': True}, 'nor': {'name': '挪威语', 'code': 'nor', 'detect': True}, 'afr': {'name': '南非荷兰语', 'code': 'afr', 'detect': True}, 'nep': {'name': '尼泊尔语', 'code': 'nep', 'detect': True}, 'pt': {'name': '葡萄牙语', 'code': 'pt', 'detect': True}, 'pan': {'name': '旁遮普语', 'code': 'pan', 'detect': True}, 'jp': {'name': '日语', 'code': 'jp', 'detect': True}, 'swe': {'name': '瑞典语', 'code': 'swe', 'detect': True}, 'srp': {'name': '塞尔维亚语', 'code': 'srp', 'detect': True}, 'sin': {'name': '僧伽罗语', 'code': 'sin', 'detect': True}, 'epo': {'name': '世界语', 'code': 'epo', 'detect': True}, 'nob': {'name': '书面挪威语', 'code': 'nob', 'detect': True}, 'sk': {'name': '斯洛伐克语', 'code': 'sk', 'detect': True}, 'slo': {'name': '斯洛文尼亚语', 'code': 'slo', 'detect': True}, 'swa': {'name': '斯瓦希里语', 'code': 'swa', 'detect': True}, 'som': {'name': '索马里语', 'code': 'som', 'detect': True}, 'th': {'name': '泰语', 'code': 'th', 'detect': True}, 'tr': {'name': '土耳其语', 'code': 'tr', 'detect': True}, 'tgk': {'name': '塔吉克语', 'code': 'tgk', 'detect': True}, 'tam': {'name': '泰米尔语', 'code': 'tam', 'detect': True}, 'tgl': {'name': '他加禄语', 'code': 'tgl', 'detect': True}, 'tel': {'name': '泰卢固语', 'code': 'tel', 'detect': True}, 'ukr': {'name': '乌克兰语', 'code': 'ukr', 'detect': True}, 'wln': {'name': '瓦隆语', 'code': 'wln', 'detect': True}, 'wel': {'name': '威尔士语', 'code': 'wel', 'detect': True}, 'urd': {'name': '乌尔都语', 'code': 'urd', 'detect': True}, 'spa': {'name': '西班牙语', 'code': 'spa', 'detect': True}, 'heb': {'name': '希伯来语', 'code': 'heb', 'detect': True}, 'el': {'name': '希腊语', 'code': 'el', 'detect': True}, 'hu': {'name': '匈牙利语', 'code': 'hu', 'detect': True}, 'fry': {'name': '西弗里斯语', 'code': 'fry', 'detect': True}, 'nno': {'name': '新挪威语', 'code': 'nno', 'detect': True}, 'en': {'name': '英语', 'code': 'en', 'detect': True}, 'hi': {'name': '印地语', 'code': 'hi', 'detect': True}, 'id': {'name': '印尼语', 'code': 'id', 'detect': True}, 'it': {'name': '意大利语', 'code': 'it', 'detect': True}, 'vie': {'name': '越南语', 'code': 'vie', 'detect': True}, 'arm': {'name': '亚美尼亚语', 'code': 'arm', 'detect': True}, 'zh': {'name': '中文(简体)', 'code': 'zh', 'detect': True}, 'cht': {'name': '中文(繁体)', 'code': 'cht', 'detect': True}, 'wyw': {'name': '中文(文言文)', 'code': 'wyw', 'detect': True}, 'yue': {'name': '中文(粤语)', 'code': 'yue', 'detect': True}} + +total_languages = 153 +supported_detect = 91 +unsupported_detect = 62 + +lang = { # 通用文本翻译 +"statistics": { + "total_languages": 153, + "supported_detect": 91, + "unsupported_detect": 62 +}, +"languages": [ + { + "name": "阿拉伯语", + "code": "ara", + "detect": True + + }, + { + "name": "爱尔兰语", + "code": "gle", + "detect": True + + }, + { + "name": "奥克语", + "code": "oci", + "detect": True + + }, + { + "name": "阿尔巴尼亚语", + "code": "alb", + "detect": True + + }, + { + "name": "阿尔及利亚阿拉伯语", + "code": "arq", + "detect": False + }, + { + "name": "阿肯语", + "code": "aka", + "detect": False + }, + { + "name": "阿拉贡语", + "code": "arg", + "detect": False + }, + { + "name": "阿姆哈拉语", + "code": "amh", + "detect": True + + }, + { + "name": "阿萨姆语", + "code": "asm", + "detect": True + + }, + { + "name": "艾马拉语", + "code": "aym", + "detect": False + }, + { + "name": "阿塞拜疆语", + "code": "aze", + "detect": True + + }, + { + "name": "阿斯图里亚斯语", + "code": "ast", + "detect": True + + }, + { + "name": "奥塞梯语", + "code": "oss", + "detect": False + }, + { + "name": "爱沙尼亚语", + "code": "est", + "detect": True + + }, + { + "name": "奥杰布瓦语", + "code": "oji", + "detect": False + }, + { + "name": "奥里亚语", + "code": "ori", + "detect": True + + }, + { + "name": "奥罗莫语", + "code": "orm", + "detect": False + }, + { + "name": "波兰语", + "code": "pl", + "detect": True + + }, + { + "name": "波斯语", + "code": "per", + "detect": True + + }, + { + "name": "布列塔尼语", + "code": "bre", + "detect": True + + }, + { + "name": "巴什基尔语", + "code": "bak", + "detect": False + }, + { + "name": "巴斯克语", + "code": "baq", + "detect": True + + }, + { + "name": "巴西葡萄牙语", + "code": "pot", + "detect": False + }, + { + "name": "白俄罗斯语", + "code": "bel", + "detect": True + + }, + { + "name": "柏柏尔语", + "code": "ber", + "detect": True + + }, + { + "name": "邦板牙语", + "code": "pam", + "detect": False + }, + { + "name": "保加利亚语", + "code": "bul", + "detect": True + + }, + { + "name": "北方萨米语", + "code": "sme", + "detect": False + }, + { + "name": "北索托语", + "code": "ped", + "detect": False + }, + { + "name": "本巴语", + "code": "bem", + "detect": False + }, + { + "name": "比林语", + "code": "bli", + "detect": False + }, + { + "name": "比斯拉马语", + "code": "bis", + "detect": False + }, + { + "name": "俾路支语", + "code": "bal", + "detect": False + }, + { + "name": "冰岛语", + "code": "ice", + "detect": True + + }, + { + "name": "波斯尼亚语", + "code": "bos", + "detect": True + + }, + { + "name": "博杰普尔语", + "code": "bho", + "detect": False + }, + { + "name": "楚瓦什语", + "code": "chv", + "detect": False + }, + { + "name": "聪加语", + "code": "tso", + "detect": False + }, + { + "name": "丹麦语", + "code": "dan", + "detect": True + + }, + { + "name": "德语", + "code": "de", + "detect": True + + }, + { + "name": "鞑靼语", + "code": "tat", + "detect": True + + }, + { + "name": "掸语", + "code": "sha", + "detect": False + }, + { + "name": "德顿语", + "code": "tet", + "detect": False + }, + { + "name": "迪维希语", + "code": "div", + "detect": False + }, + { + "name": "低地德语", + "code": "log", + "detect": True + + }, + { + "name": "俄语", + "code": "ru", + "detect": True + + }, + { + "name": "法语", + "code": "fra", + "detect": True + + }, + { + "name": "菲律宾语", + "code": "fil", + "detect": True + + }, + { + "name": "芬兰语", + "code": "fin", + "detect": True + + }, + { + "name": "梵语", + "code": "san", + "detect": False + }, + { + "name": "弗留利语", + "code": "fri", + "detect": False + }, + { + "name": "富拉尼语", + "code": "ful", + "detect": False + }, + { + "name": "法罗语", + "code": "fao", + "detect": False + }, + { + "name": "盖尔语", + "code": "gla", + "detect": False + }, + { + "name": "刚果语", + "code": "kon", + "detect": False + }, + { + "name": "高地索布语", + "code": "ups", + "detect": False + }, + { + "name": "高棉语", + "code": "hkm", + "detect": True + + }, + { + "name": "格陵兰语", + "code": "kal", + "detect": False + }, + { + "name": "格鲁吉亚语", + "code": "geo", + "detect": True + + }, + { + "name": "古吉拉特语", + "code": "guj", + "detect": True + + }, + { + "name": "古希腊语", + "code": "gra", + "detect": False + }, + { + "name": "古英语", + "code": "eno", + "detect": False + }, + { + "name": "瓜拉尼语", + "code": "grn", + "detect": False + }, + { + "name": "韩语", + "code": "kor", + "detect": True + + }, + { + "name": "荷兰语", + "code": "nl", + "detect": True + + }, + { + "name": "胡帕语", + "code": "hup", + "detect": False + }, + { + "name": "哈卡钦语", + "code": "hak", + "detect": False + }, + { + "name": "海地语", + "code": "ht", + "detect": False + }, + { + "name": "黑山语", + "code": "mot", + "detect": False + }, + { + "name": "豪萨语", + "code": "hau", + "detect": False + }, + { + "name": "吉尔吉斯语", + "code": "kir", + "detect": False + }, + { + "name": "加利西亚语", + "code": "glg", + "detect": True + + }, + { + "name": "加拿大法语", + "code": "frn", + "detect": False + }, + { + "name": "加泰罗尼亚语", + "code": "cat", + "detect": True + + }, + { + "name": "捷克语", + "code": "cs", + "detect": True + + }, + { + "name": "卡拜尔语", + "code": "kab", + "detect": True + + }, + { + "name": "卡纳达语", + "code": "kan", + "detect": True + + }, + { + "name": "卡努里语", + "code": "kau", + "detect": False + }, + { + "name": "卡舒比语", + "code": "kah", + "detect": False + }, + { + "name": "康瓦尔语", + "code": "cor", + "detect": False + }, + { + "name": "科萨语", + "code": "xho", + "detect": True + + }, + { + "name": "科西嘉语", + "code": "cos", + "detect": False + }, + { + "name": "克里克语", + "code": "cre", + "detect": False + }, + { + "name": "克里米亚鞑靼语", + "code": "cri", + "detect": False + }, + { + "name": "克林贡语", + "code": "kli", + "detect": False + }, + { + "name": "克罗地亚语", + "code": "hrv", + "detect": True + + }, + { + "name": "克丘亚语", + "code": "que", + "detect": False + }, + { + "name": "克什米尔语", + "code": "kas", + "detect": False + }, + { + "name": "孔卡尼语", + "code": "kok", + "detect": False + }, + { + "name": "库尔德语", + "code": "kur", + "detect": True + + }, + { + "name": "拉丁语", + "code": "lat", + "detect": True + + }, + { + "name": "老挝语", + "code": "lao", + "detect": False + }, + { + "name": "罗马尼亚语", + "code": "rom", + "detect": True + + }, + { + "name": "拉特加莱语", + "code": "lag", + "detect": False + }, + { + "name": "拉脱维亚语", + "code": "lav", + "detect": True + + }, + { + "name": "林堡语", + "code": "lim", + "detect": False + }, + { + "name": "林加拉语", + "code": "lin", + "detect": False + }, + { + "name": "卢干达语", + "code": "lug", + "detect": False + }, + { + "name": "卢森堡语", + "code": "ltz", + "detect": False + }, + { + "name": "卢森尼亚语", + "code": "ruy", + "detect": False + }, + { + "name": "卢旺达语", + "code": "kin", + "detect": True + + }, + { + "name": "立陶宛语", + "code": "lit", + "detect": True + + }, + { + "name": "罗曼什语", + "code": "roh", + "detect": False + }, + { + "name": "罗姆语", + "code": "ro", + "detect": False + }, + { + "name": "逻辑语", + "code": "loj", + "detect": False + }, + { + "name": "马来语", + "code": "may", + "detect": True + + }, + { + "name": "缅甸语", + "code": "bur", + "detect": True + + }, + { + "name": "马拉地语", + "code": "mar", + "detect": False + }, + { + "name": "马拉加斯语", + "code": "mg", + "detect": True + + }, + { + "name": "马拉雅拉姆语", + "code": "mal", + "detect": True + + }, + { + "name": "马其顿语", + "code": "mac", + "detect": True + + }, + { + "name": "马绍尔语", + "code": "mah", + "detect": False + }, + { + "name": "迈蒂利语", + "code": "mai", + "detect": True + + }, + { + "name": "曼克斯语", + "code": "glv", + "detect": False + }, + { + "name": "毛里求斯克里奥尔语", + "code": "mau", + "detect": False + }, + { + "name": "毛利语", + "code": "mao", + "detect": False + }, + { + "name": "孟加拉语", + "code": "ben", + "detect": True + + }, + { + "name": "马耳他语", + "code": "mlt", + "detect": True + + }, + { + "name": "苗语", + "code": "hmn", + "detect": False + }, + { + "name": "挪威语", + "code": "nor", + "detect": True + + }, + { + "name": "那不勒斯语", + "code": "nea", + "detect": False + }, + { + "name": "南恩德贝莱语", + "code": "nbl", + "detect": False + }, + { + "name": "南非荷兰语", + "code": "afr", + "detect": True + + }, + { + "name": "南索托语", + "code": "sot", + "detect": False + }, + { + "name": "尼泊尔语", + "code": "nep", + "detect": True + + }, + { + "name": "葡萄牙语", + "code": "pt", + "detect": True + + }, + { + "name": "旁遮普语", + "code": "pan", + "detect": True + + }, + { + "name": "帕皮阿门托语", + "code": "pap", + "detect": False + }, + { + "name": "普什图语", + "code": "pus", + "detect": False + }, + { + "name": "齐切瓦语", + "code": "nya", + "detect": False + }, + { + "name": "契维语", + "code": "twi", + "detect": False + }, + { + "name": "切罗基语", + "code": "chr", + "detect": False + }, + { + "name": "日语", + "code": "jp", + "detect": True + + }, + { + "name": "瑞典语", + "code": "swe", + "detect": True + + }, + { + "name": "萨丁尼亚语", + "code": "srd", + "detect": False + }, + { + "name": "萨摩亚语", + "code": "sm", + "detect": False + }, + { + "name": "塞尔维亚-克罗地亚语", + "code": "sec", + "detect": False + }, + { + "name": "塞尔维亚语", + "code": "srp", + "detect": True + + }, + { + "name": "桑海语", + "code": "sol", + "detect": False + }, + { + "name": "僧伽罗语", + "code": "sin", + "detect": True + + }, + { + "name": "世界语", + "code": "epo", + "detect": True + + }, + { + "name": "书面挪威语", + "code": "nob", + "detect": True + + }, + { + "name": "斯洛伐克语", + "code": "sk", + "detect": True + + }, + { + "name": "斯洛文尼亚语", + "code": "slo", + "detect": True + + }, + { + "name": "斯瓦希里语", + "code": "swa", + "detect": True + + }, + { + "name": "塞尔维亚语(西里尔)", + "code": "src", + "detect": False + }, + { + "name": "索马里语", + "code": "som", + "detect": True + + }, + { + "name": "苏格兰语", + "code": "sco", + "detect": False + }, + { + "name": "泰语", + "code": "th", + "detect": True + + }, + { + "name": "土耳其语", + "code": "tr", + "detect": True + + }, + { + "name": "塔吉克语", + "code": "tgk", + "detect": True + + }, + { + "name": "泰米尔语", + "code": "tam", + "detect": True + + }, + { + "name": "他加禄语", + "code": "tgl", + "detect": True + + }, + { + "name": "提格利尼亚语", + "code": "tir", + "detect": False + }, + { + "name": "泰卢固语", + "code": "tel", + "detect": True + + }, + { + "name": "突尼斯阿拉伯语", + "code": "tua", + "detect": False + }, + { + "name": "土库曼语", + "code": "tuk", + "detect": False + }, + { + "name": "乌克兰语", + "code": "ukr", + "detect": True + + }, + { + "name": "瓦隆语", + "code": "wln", + "detect": True + + }, + { + "name": "威尔士语", + "code": "wel", + "detect": True + + }, + { + "name": "文达语", + "code": "ven", + "detect": False + }, + { + "name": "沃洛夫语", + "code": "wol", + "detect": False + }, + { + "name": "乌尔都语", + "code": "urd", + "detect": True + + }, + { + "name": "西班牙语", + "code": "spa", + "detect": True + + }, + { + "name": "希伯来语", + "code": "heb", + "detect": True + + }, + { + "name": "希腊语", + "code": "el", + "detect": True + + }, + { + "name": "匈牙利语", + "code": "hu", + "detect": True + + }, + { + "name": "西弗里斯语", + "code": "fry", + "detect": True + + }, + { + "name": "西里西亚语", + "code": "sil", + "detect": False + }, + { + "name": "希利盖农语", + "code": "hil", + "detect": False + }, + { + "name": "下索布语", + "code": "los", + "detect": False + }, + { + "name": "夏威夷语", + "code": "haw", + "detect": False + }, + { + "name": "新挪威语", + "code": "nno", + "detect": True + + }, + { + "name": "西非书面语", + "code": "nqo", + "detect": False + }, + { + "name": "信德语", + "code": "snd", + "detect": False + }, + { + "name": "修纳语", + "code": "sna", + "detect": False + }, + { + "name": "宿务语", + "code": "ceb", + "detect": False + }, + { + "name": "叙利亚语", + "code": "syr", + "detect": False + }, + { + "name": "巽他语", + "code": "sun", + "detect": False + }, + { + "name": "英语", + "code": "en", + "detect": True + + }, + { + "name": "印地语", + "code": "hi", + "detect": True + + }, + { + "name": "印尼语", + "code": "id", + "detect": True + + }, + { + "name": "意大利语", + "code": "it", + "detect": True + + }, + { + "name": "越南语", + "code": "vie", + "detect": True + + }, + { + "name": "意第绪语", + "code": "yid", + "detect": False + }, + { + "name": "因特语", + "code": "ina", + "detect": False + }, + { + "name": "亚齐语", + "code": "ach", + "detect": False + }, + { + "name": "印古什语", + "code": "ing", + "detect": False + }, + { + "name": "伊博语", + "code": "ibo", + "detect": False + }, + { + "name": "伊多语", + "code": "ido", + "detect": False + }, + { + "name": "约鲁巴语", + "code": "yor", + "detect": False + }, + { + "name": "亚美尼亚语", + "code": "arm", + "detect": True + + }, + { + "name": "伊努克提图特语", + "code": "iku", + "detect": False + }, + { + "name": "中文(简体)", + "code": "zh", + "detect": True + + }, + { + "name": "中文(繁体)", + "code": "cht", + "detect": True + + }, + { + "name": "中文(文言文)", + "code": "wyw", + "detect": True + + }, + { + "name": "中文(粤语)", + "code": "yue", + "detect": True + + }, + { + "name": "扎扎其语", + "code": "zaz", + "detect": False + }, + { + "name": "中古法语", + "code": "frm", + "detect": False + }, + { + "name": "祖鲁语", + "code": "zul", + "detect": False + }, + { + "name": "爪哇语", + "code": "jav", + "detect": False + }, + { + "name": "自动检测", + "code": "auto", + "detect": True + + } +] +} \ No newline at end of file diff --git a/app/__pycache__/apps.cpython-312.pyc b/app/__pycache__/apps.cpython-312.pyc index efa9a5f2a3e629270005a83b9c908c6247e9d56b..5babf99b5bd2f474bcfc1cbab3072245e7af5ce7 100644 GIT binary patch delta 249 zcmZo--p|Z?nwOW00SK-I9m$+9kvG>(1jw1rkjfCnn8Fanl)@OroWc~vQpv2zQp60D zs*+8~O3X{o*Goy#%gs+o%_-J%%1n1GEy;JwOwCET#hh4B;HSwtajvScP)cfAVrfoE zd?HXbJ`E&2@t_`Gaz<%hWodjtQGQlxa>>NM(gnOgb6Xg0NLpNA5xc=H(CAXc0~7&U z=cmbZiyLYq(BxvUU=cS+8mtDS^%jQ>&?Tigsdh#DKrSN?7lVB9ftit!@h*en7d9qF N!3msS8Gsa67XZb4Lcah2 delta 212 zcmdnb+{Da#nwOW00SLag9Lfxv$eXJy0OU+(NM(p(Oks#(N@0v*u4K|=E@B1>-(pTI zDDcx{nRq~T;!oXrm#oCR^!$LL{H)aE5~CQP90(Wd6;y&%g9#R(wqkZ5(ZX5An}2jk&#j4 UE`#D1HbzFl37lUUfD~98062d!DgXcg diff --git a/app/__pycache__/models.cpython-312.pyc b/app/__pycache__/models.cpython-312.pyc index 46df25241f9ac9806e8e93553ebd5b9256f269ca..c9965e7717c05478e2f45faf1bd18fbdd4ce7490 100644 GIT binary patch delta 126 zcmX@kIET^vG%qg~0}z-u9L)sLk3j@F_{;(nna)tjpvmaBlA(x+fnj32x?OTcXJmtkIamWj77{q766%> B90>pb delta 148 zcmbQkc$_i*G%qg~0}y;~Ih1Jwq#uJgFu(+5d=>yQrZc24q%h_%NzEzt(`35EnUa;5m!7Yel2pVDlw3K{T%FGaEEG_bpOu)E|fd diff --git a/app/__pycache__/urls.cpython-312.pyc b/app/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f80ba61f12992873a3f0ea0cdbcec917e26afbcc GIT binary patch literal 284 zcmX@j%ge<81WAoYGvk5uV-N=hn4pZ$DnQ0`h7^Vr#vF!R#wbQc5SuB7DVI5lIhQ4h zg^?khA&Rwprduopi6t4g*faBzb4pWE{WRHb@ug%X=B4NB zCFkdr6lEqAF#~nn;)V*A7UdKdu>eJiSi!z|6?Vc$Y!pK7;B9CT4!7M(!d|pa1~I@JyNj literal 0 HcmV?d00001 diff --git a/chunyu_project/__pycache__/asgi.cpython-312.pyc b/chunyu_project/__pycache__/asgi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1e22e90cbe521b0953031e61642a5c66719fbe2 GIT binary patch literal 429 zcmX@j%ge<81d}|DWS$4ok3k$5V1Y6|#{n7B8B!Qh7;_k+Kr~YhV=hw^6C*<^LlzrM zIfBmOM6hA36y_9`)l3i`BLfpdD${DHR1|9^qbBQ15YJDO@s>z>YDs)zae8KaVnIPp zW^!UlW`5o+F&8gKKX?E5VAqfkPe1qIcwc{)P#@PS@#Kusyvow}f};Ga)Z`Mq;?$Co z%)InsO}1N1`Ng*cQnC{B()0C_^NUjTK!z4E1FgBmo|;#dSp+ne3#dLNH7&6;r{oql zl6@-~K7-uz%f;C$CbT%Us5r*Z$kNaxCZIAoBe5tq0AgEl465zuT#$u&1(mlrY;yBc zN^?@}igehN+Wj>H&8tQY_xLM literal 0 HcmV?d00001 diff --git a/chunyu_project/__pycache__/settings.cpython-312.pyc b/chunyu_project/__pycache__/settings.cpython-312.pyc index 429287c0a70ab22059df199cdcdfe1d2f066c200..f49c08cc6e76f4a8c0ae70021a78c1fc0bd2606a 100644 GIT binary patch literal 8145 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 Hd!*%Gw35Fr diff --git a/chunyu_project/__pycache__/urls.cpython-312.pyc b/chunyu_project/__pycache__/urls.cpython-312.pyc index a059a93410a97a0b0e70248c7f0ace1e524a5b5f..cadcf296b8a3fcf3d7e3e4b0db36b8ba816faf05 100644 GIT binary patch delta 424 zcmbQtaf4I+G%qg~0}vc+Jes+XnStRkhyw$hP{!vi6V>JGb6KNU85x)uQdv@1Qkk-N zV5$&w79WBQW36U_u)z9Qfh21R+iFIL7>XP_SdIg$94Amtnl*(BT{4{|ildTSlV@Yc zOeSBZTPy{MB^kHaGxL&jN>fs+*b-B6GxPMTSWAmji}b5FL6lx;QBH9cOJYH$eia9h zg!2o)`~ooFPm^=9F|z?v5$ogxW*5HXjMBWy()fa+{H)aElF6Hxm2&uj9sqfwI0{I7 zU}j`w{K&-5$nsTzfl={3gX%{v23F1vi3z6DttMJcx1VT#nML^~3rC0eMD-ckmxa_W hv#5i(ViUz@NL?0Gxy+)9#{Iy_%FoouUBnAC9sme%T$}&^ delta 206 zcmcb?IhjNKG%qg~0}!ZGAIg+qW?*;>;=lk4l<_%cqPn~SBLfpdDoYAWDpM9%3rrP+ z&f=MvCB>1>7{y-6s>!zT!AvG0##<}}i6t3TY>6qknR)ttnjDjlF&j+&&FskMl9ia3 zo*z(@pOu%{MaiBIXbvL~7wZCv56p~=j31f!8Ckw6Ffc0KWsv#E#=y$iAu+*p by46Ih>Gl)tFS96rU}oZHYUD2B0qOt%)Uh^Zk((?VK=u&|l#z9bW7XO^8wYU-&c zKZ2jYgY;W?^-@s~_8^LQ@TTPE$=Up&?HuO4H;><+_n41sYYsAJ^YsVz4kPq4FP5jU zNTx?7d5a>{K@pBDjyu>yn_IEnu`vQXTwOvg;;?j)FSDo+T|2Yp6-E{U`)twbtW2!R z%E>q9WxLTNp%gvVCq0>xa4-^+QIMo^2%#p6=sHeQ6L^(K1&ZhakU5TWPLDVcst6^q zj7A*paTo(9W16yAOVAi1((TeD;Vh(@Nzv^ZzGp@(mMIV>jBY$@5Gf2fQ>4c@+$9RY z8EBoTZO@BjsN85sMPDvGg);U)cn{pFH;~6#dJ!aCPGS(+J63(>IluF1TNRw$>VppQ zx8RbEY@@#Wq}A99+B*ja%~qowyx6NBKHoXHeRT=00<-a>QA@*Lj|ewYg-R%_x=4zIG|~~ zKi|Fb>$7ne<(7Zdm7fc`$s}8SG++GVv}{PtpF*l?u0J-$_^(yOh3QR%onNT-9a(Rj fQ|BvM|Af}hH{A1T^9$PjQNHuJym?wmuN%;RsX@pU diff --git a/chunyu_project/settings.py b/chunyu_project/settings.py index 35f570b..665a729 100644 --- a/chunyu_project/settings.py +++ b/chunyu_project/settings.py @@ -28,6 +28,11 @@ SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_HSTS_PRELOAD = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') +PASSWORD_HASHERS = [ + 'django.contrib.auth.hashers.Argon2PasswordHasher', + 'django.contrib.auth.hashers.PBKDF2PasswordHasher', +] + # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-j+-psq=m++l7hup73k1eg+wm-b&2_)!+_^o=6(=xc$1px*kqt@' @@ -67,12 +72,12 @@ ALLOWED_HOSTS = ["*"] CORS_ALLOWED_ORIGINS = [ "http://localhost:3000", # 例如:您的React/Vue开发服务器 "http://127.0.0.1:3000", + "http://192.168.1.4:3000", + "https://192.168.1.4:3000", "http://*", "https://*" ] -# CORS设置 -CORS_ALLOW_ALL_ORIGINS = False # 允许凭据 CORS_ALLOW_CREDENTIALS = True @@ -143,6 +148,17 @@ SIMPLE_JWT = { 'USER_ID_CLAIM': 'user_id', } +# 邮件部分 + +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 使用SMTP +EMAIL_HOST = 'smtp.qq.com' # 需要真实的SMTP服务器 +EMAIL_PORT = 465 +EMAIL_USE_SSL = True +EMAIL_HOST_USER = 'cs10086086@qq.com' # 真实邮箱账号 +EMAIL_HOST_PASSWORD = 'ldzpymytsinkfjhb' # 真实密码/授权码 +EMAIL_USE_TLS = False + + AUTH_USER_MODEL = 'user.FUser' INSTALLED_APPS = [ @@ -155,6 +171,8 @@ INSTALLED_APPS = [ 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django.contrib.sites', # 第三方应用 @@ -168,7 +186,122 @@ INSTALLED_APPS = [ ] + +# Database +# https://docs.djangoproject.com/en/6.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'chunyu_project', # 数据库名 + 'USER': 'root', # 数据库用户名 + 'PASSWORD': 'mysql_NpyMCS', # 数据库密码 + 'HOST': '192.168.1.4', # 数据库主机,留空默认为localhost + 'PORT': '3306', # 数据库端口,留空默认为3306 + 'OPTIONS': { + 'charset': 'utf8mb4', + 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", + 'connect_timeout': 10, # 连接超时时间(秒) + }, + 'CONN_MAX_AGE': 3600, # 连接池最大存活时间(秒),0表示每次请求后关闭 + 'CONN_HEALTH_CHECKS': True, # 连接健康检查 + 'ATOMIC_REQUESTS': False, # 是否将每个HTTP请求包装在事务中 + 'AUTOCOMMIT': True, # 是否自动提交事务 + 'TIME_ZONE': 'Asia/Shanghai', + } +} + + +# Redis配置 +REDIS_HOST = '192.168.1.4' # Redis服务器地址 +REDIS_PORT = 6379 # Redis端口 +REDIS_DB = 0 # Redis数据库编号 +REDIS_PASSWORD = "+Xy2173240465" # Redis密码,没有密码则设为None +SESSION_DB = 1 +CELERY_BROKER_DB = 2 +CELERY_RESULT_BACKEND_DB = 2 + +# Django缓存配置(使用Redis作为缓存后端) +CACHES = { + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}", + + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient", + "PASSWORD": REDIS_PASSWORD, + "PARSER_CLASS": "redis.connection._HiredisParser", # 使用hiredis提高性能 + 'CONNECTION_POOL_CLASS': 'redis.BlockingConnectionPool', + 'CONNECTION_POOL_CLASS_KWARGS': { + 'max_connections': 50, + 'timeout': 20, + }, + 'MAX_CONNECTIONS': 50, + 'PICKLE_VERSION': -1, + 'SOCKET_CONNECT_TIMEOUT': 5, + 'SOCKET_TIMEOUT': 5, + 'COMPRESSOR': 'django_redis.compressors.zlib.ZlibCompressor', + 'SERIALIZER': 'django_redis.serializers.json.JSONSerializer', + 'COMPRESS_MIN_LENGTH': 1024 * 10, + 'IGNORE_EXCEPTIONS': True, # 缓存宕机时不崩溃 + }, + "KEY_PREFIX": "django_", # 缓存键前缀 + "VERSION": 1, # 缓存版本 + }, + 'session': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': f"redis://{REDIS_HOST}:{REDIS_PORT}/{SESSION_DB}", + 'OPTIONS': { + 'CLIENT_CLASS': 'django_redis.client.DefaultClient', + } + }, + 'celery': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': 'redis://:password@redis-celery:6379/0', + 'OPTIONS': { + 'CLIENT_CLASS': 'django_redis.client.DefaultClient', + } + } +} + +# 会话配置 +SESSION_ENGINE = 'django.contrib.sessions.backends.cache' +SESSION_CACHE_ALIAS = 'session' +SESSION_COOKIE_AGE = 1209600 +SESSION_COOKIE_SECURE = True +SESSION_COOKIE_HTTPONLY = True +SESSION_COOKIE_SAMESITE = 'Lax' + +# Celery配置 +CELERY_BROKER_URL = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/{CELERY_BROKER_DB}' +CELERY_RESULT_BACKEND = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/{CELERY_RESULT_BACKEND_DB}' +CELERY_CACHE_BACKEND = 'celery' +CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True + +# 缓存中间件 +CACHE_MIDDLEWARE_ALIAS = 'default' +CACHE_MIDDLEWARE_SECONDS = 60 * 15 +CACHE_MIDDLEWARE_KEY_PREFIX = 'chunyu_site' + +# 安全头 +SECURE_BROWSER_XSS_FILTER = True +SECURE_CONTENT_TYPE_NOSNIFF = True +X_FRAME_OPTIONS = 'DENY' + +# 定时任务:预热缓存 +CELERY_BEAT_SCHEDULE = { + 'warm-up-cache-every-hour': { + 'task': 'core.tasks.warm_up_cache', + 'schedule': 3600.0, # 每小时 + }, + 'generate-daily-report': { + 'task': 'reports.tasks.generate_daily_report', + 'schedule': 86400.0, # 每天 + }, +} + MIDDLEWARE = [ + 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'corsheaders.middleware.CorsMiddleware', @@ -177,8 +310,13 @@ MIDDLEWARE = [ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.cache.FetchFromCacheMiddleware', ] +CACHE_MIDDLEWARE_ALIAS = 'default' +CACHE_MIDDLEWARE_SECONDS = 60 * 15 # 15分钟 +CACHE_MIDDLEWARE_KEY_PREFIX = 'mysite' + ROOT_URLCONF = 'chunyu_project.urls' TEMPLATES = [ @@ -200,16 +338,13 @@ TEMPLATES = [ ASGI_APPLICATION = 'chunyu_project.asgi.application' -# Database -# https://docs.djangoproject.com/en/6.0/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} +# 使用Redis作为会话后端 +SESSION_ENGINE = "django.contrib.sessions.backends.cache" +SESSION_CACHE_ALIAS = "default" +# 使用Redis作为消息代理 +CELERY_BROKER_URL = 'redis://localhost:6379/0' +CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # Password validation # https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators @@ -246,3 +381,12 @@ USE_TZ = True # https://docs.djangoproject.com/en/6.0/howto/static-files/ STATIC_URL = 'static/' + +STATICFILES_DIRS = [ + BASE_DIR / "static", +] + +STATIC_ROOT = BASE_DIR / "staticfiles" + + + diff --git a/user/__pycache__/__init__.cpython-312.pyc b/user/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c758b628c0c787feba138946d78370818638349 GIT binary patch literal 159 zcmX@j%ge<81R6m{GC}lX5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!vU9eI2`x@7DvmKU zvNSY_38+lYNG!??D9X=DO)e>pNzN$Et1OK#fbe5Vfl6cI<1_OzOXB183My}L*yQG? bl;)(`6|n-1V+7)25aS~=BO_xGGmr%U4O}Np literal 0 HcmV?d00001 diff --git a/user/__pycache__/admin.cpython-312.pyc b/user/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e60906269aa74ddccb674c43bfe0b9e0e204a32a GIT binary patch literal 203 zcmX@j%ge<81R6m{GM#|*V-N=hn4pZ$0zk%eh7^Vr#vF!R#wbQchDs()=9eI8O~zZS zi7C06d48HqxA;=B67$mY^^)`RN{TX*ikN{4Rx*4BsrzN^Y!wq)oLW>IV`yY)Xc7}p znVgYWlp9c#pOuY5S_idNX&<55Fv$yjd;yL#6p7zF```vg3WQToVT0gY%Ifpm6e?kZLHkAJ-3*7Z|A+8oq26GYaq_v<%|C)@`ohInEBtt*9+0&sSjunxcKcmN_U2A!|EP1|3^Q-yvT(@a8|qED z<4w{iOL3yOBYQh;l5i`@m|Rv73;}pkgc&T_hi}H#qP}r|#^g;=ADDVxFQ<}bCfBFz o4T%cjnm~E=SPgQ*)&-TD<8o_XIzs3jcD`3M)Ou+DfJlYw4@_BgZ~y=R literal 0 HcmV?d00001 diff --git a/user/__pycache__/models.cpython-312.pyc b/user/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5e3266dd3d51cda985504f0f29c373bf697a0b2 GIT binary patch literal 1113 zcmZuwO-vI(6rSB}OS^PIZ4;9UM1zs^QUekb4KYCyj1dV5Xtb$Lww;j{x4SsIidGC8~e=3R$ z*t!=gWIl@k{Nm2P<=qG6CI+Se0!Yw6R)`A%$D$@?rMM&j5nKaE8Ue_Ig;~kH6Zho2 zQQr=Cq5=)JCQXZ|DeIPr3G;nf17Xcfxm?%!_MP$)15*HlxPU-h6akj{{D+AyMgkI% zH0L>Z(CaXRM=-sNDI(uo#jM9YjaN9_V@GiPj2So-HQ+GAM=(Vs&sEMc$@q#_qTmRK z2XjiaihA35nLE{NzsC+RyE!(#`Fg1|@hK`%Ijasr4ePyDntGF(sz0Q`0ZfvHiJ`7$ z@sM8~P%V|1=WVV?>CMN|vx%sO2JC*#P!Y5Y!b4JzZfhFhz02$g0NA|njm7sHOG{hx z`He5*_9?cp`D&pw`F3OROX=mz_WZZ4uk+jAUz8S}Z%sdqicTCSLW%`ASRC^vmLtqe zfhVBv;OIZ-W?k)Mjr7~BQl2)$9usR1On&|JpO&`E2`++}Xl%OF*qrFfrP3AcT)>RpTi_NO=EgppB){p1~TT!Tz+NGu`cM5)&$4&#JxH zJ@L6+pn)DdXt`TbGGox-Rm0G*s=HfC#_Yycmui}i4T8vV7XBR|JWs-hi|`IQhW|;< zxQ~Ec9|)hFyjTp?7ee(jWHJ2X#%kzJzGF?P8@*jr>IzETOk}Zn8Liw^SCwSGeNB#x zo-4|cf*hGneF!giuFBo{wzY7>WP35(PzX27pq1A9t6`YGS*{YiweI`;>CUK^Mo^!s z_ZqR3p<5)AjH$Mjj=543-ewxuC!nMwkDGHHPyC<`>Thucy+Y2g1KwiuBs05`APDQ= U!aAtg^HmA8qaD8i`#2Z>0>g1A0ssI2 literal 0 HcmV?d00001 diff --git a/user/__pycache__/urls.cpython-312.pyc b/user/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84bfd7b0f9c7051b8293accadc024829ab5729a5 GIT binary patch literal 917 zcmaJ<%WB&|6dgS*$?p_H+gQ+c(|{>RcHB}D+HOi0eNdY|vJeKLSYum`MlvHg#@=<8 zenImKCH;W>LpL%um=2UKy2>sgltNdXk!%84Sc^Mz&fIhEovZnt&u0MrM$*)2@BsW~ zVD%}>&1H@Q;0v&U&A9+^2FI~I@A6161SA?_j0HD^Btt^7AtS|5C@0z}H;pnzh66l+ zf-TV~^>421uhx_0)|S61Cqe>ZMVdx=ts-+xk);Y{ts-|#k*A8xT1DYX(G`u{xLDaZ zV@*~#lCo^%com+A11szi+40)$(1sO(ls@L^fjb9qeEj^kSwM zGkXv_oiQWM=%|@-{yp^Uj{(Flkma}&DP(Rsxe>3XAKRJ(>PvG)&q8ogNK$ZOu9JL{ zy2O(N>W6V9o#c|!1WpPVcAX%E*bHb{ofO$(4rzH4viff;c~Y?Zme=*Qw(o`5*~jcZ zk?fKjVmH7dWpIkocj)~>vx8}0BOf1_frADv?2kh2klr!C63diXU~i0MVpe1IFnf+f zwgQuJBukCyWNBw!@D*IrGw^Ts`EH9%CTP{RcWMt?&2hVDVbsKaAGX7w)$R?w@z5M3 zxW!ystUqlqCdw1!+d~&V!<*EK%{ur@!@0n5+)r@t7r6hI7did{(C{Y*xUCBXq|!&X zqmmYtwiYFATGD2vYV`QkTzvgQRHF1|q}C(#!9uN1)%r|*blRAUZ|KR<-KbnU))(d4 ov|O8&>!;dWe7RCokDo5o>Qt@H)a_`8d7WqFBL69iZ_#f418~swr2qf` literal 0 HcmV?d00001 diff --git a/user/migrations/0001_initial.py b/user/migrations/0001_initial.py index 525cdf0..7615b7e 100644 --- a/user/migrations/0001_initial.py +++ b/user/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.12 on 2026-03-25 21:58 +# Generated by Django 5.2.12 on 2026-04-04 09:10 import django.contrib.auth.models import django.contrib.auth.validators diff --git a/user/migrations/0002_fuser_issetpassword.py b/user/migrations/0002_fuser_issetpassword.py new file mode 100644 index 0000000..99770bb --- /dev/null +++ b/user/migrations/0002_fuser_issetpassword.py @@ -0,0 +1,19 @@ +# Generated by Django 5.2.12 on 2026-04-04 13:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('user', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='fuser', + name='isSetPassword', + field=models.BooleanField(blank=True, default=False, verbose_name='是否主动设置过密码'), + preserve_default=False, + ), + ] diff --git a/user/migrations/__pycache__/0001_initial.cpython-312.pyc b/user/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db19b30ba8d0812f9133a21c1292dcb947a22ae9 GIT binary patch literal 3971 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 moQ}ph6 literal 0 HcmV?d00001 diff --git a/user/migrations/__pycache__/__init__.cpython-312.pyc b/user/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..701895517c8779bad6152f0c5c84bc1b559581fc GIT binary patch literal 170 zcmX@j%ge<81R6m{GC}lX5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!@^rR}2`x@7DvmKU zvNSY_38+lYNG!??D9X=DO)e>pNzN$Et1OK#fbe5Vfl6a?Gt-L_OEUBGieuvAGxIV_ m;^XxSDsOSvwtI1ma>4<0CU8BV!RWkOcraM=S9F literal 0 HcmV?d00001 diff --git a/user/models.py b/user/models.py index 5d1c288..9db1e7e 100644 --- a/user/models.py +++ b/user/models.py @@ -8,6 +8,7 @@ class FUser(AbstractUser): phone_number = models.CharField(max_length=15, blank=True, verbose_name='手机号') avatar = models.ImageField(upload_to='avatars/', blank=True, null=True, verbose_name='头像') bio = models.TextField(max_length=500, blank=True, verbose_name='个人简介') + isSetPassword = models.BooleanField(blank=True, verbose_name='是否主动设置过密码') # class Meta: # # 定义在管理后台显示的名称 diff --git a/user/urls.py b/user/urls.py index 3a944c4..9546173 100644 --- a/user/urls.py +++ b/user/urls.py @@ -6,11 +6,13 @@ from rest_framework_simplejwt.views import ( TokenVerifyView, ) +from .views.user import SendUserEmail + urlpatterns = [ # JWT 认证接口 - path('user/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('user/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('user/token/verify/', TokenVerifyView.as_view(), name='token_verify'), - + path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), + path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), + path('token/verify/', TokenVerifyView.as_view(), name='token_verify'), + path('register_send/', SendUserEmail.as_view(), name='send_user_email'), ] \ No newline at end of file diff --git a/user/views.py b/user/views.py deleted file mode 100644 index 956f8b0..0000000 --- a/user/views.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.urls import path, include -from rest_framework_simplejwt.views import ( - TokenObtainPairView, - TokenRefreshView, - TokenVerifyView, -) - -urlpatterns = [ - # JWT 认证接口 - path('user/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), - path('user/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), - path('user/token/verify/', TokenVerifyView.as_view(), name='token_verify'), - - -] \ No newline at end of file diff --git a/user/views/__init__.py b/user/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/user/views/__pycache__/__init__.cpython-312.pyc b/user/views/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c2ff459106919c83ecb1284599ba2f9ad444968 GIT binary patch literal 165 zcmX@j%ge<81i!ys$OO@kK?FMZ%mNgd&QQsq$>_I|p@<2{`wUX^%f;C$CbT%Us5r*Z z$kNaxCZIAoBe5tqpeR2pHMyiXCOM-tud+100K$(c1uBgx%SJmtkIamWj77{q762rDD_{Ts literal 0 HcmV?d00001 diff --git a/user/views/__pycache__/user.cpython-312.pyc b/user/views/__pycache__/user.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aecfc3d68231ba54220d099ee0ee899a9fd3dc08 GIT binary patch literal 3335 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