这是一个Java里Java气的
django
项目,有熟悉的bean实体类(在models.py),有dao用于数据库操作(在dao.py)
static
目录下API接口文档.md
环境要求:MySQL 8、python3.11、django4.2、pymysql
将根目录下的 sports_shop.sql
附加到你的mysql中
在sports_shop_backend_war/dao.py
文件中,将登录名和密码修改为你mysql的配置
一共有如下两个个:
pip install django==4.2
pip install pymysql
前端已经写死了请求后端api的基准地址为http://127.0.0.1:8888
因此需要切到 项目根目录
执行如下命令:
python .\manage.py runserver 8888
然后,就可以项目就跑起来了
django自带的ORM对mysql进行增删改查很奇怪,会给你的数据库生成一大堆表(似乎帮你搞好了一个后台管理系统) 与spring开发并不相同,没法用实体类对应数据库表的习惯来理解这东西
Template 这东西并不能挂载静态资源
得用static来挂载静态资源,默认访问路径是 ip+端口号/static/xxx
挂载vue打包后的静态文件,只需在urls.py的urlpatterns中添加一行:
path('', RedirectView.as_view(url='/static/index.html', permanent=False), name='index'),
python这语言简直是非主流,当你习惯了主流C,Java,JavaScript之类的语言,再来写python,简直要世界观崩塌 关于实体类:
entity.User.User
是的,第一个是文件名,第二个是类名sys.path.appedn()
去拼接路径不错不错,逐渐适应了这个语言
django现在暂时只用来挂载我vue打包好的静态页面,默认进入loclahost:8000
的时候,自动路由跳转到localhost:8000/static/index.html
在django_shop项目下,有一个名为sports_shop_backend_war的app 这个app里面目前主要编写的文件夹和文件有
entity里面是实体类 dao里面是一些未来service将要用到的数据库操作 test.py用来测试写好的代码,已经测了各个实体类,还有一些XxxDaoImpl类下的方法
由于python奇葩的导包机制,比如
¬父级目录∨:
urls.py
views.py
¬dao文件夹∨:
UserDao.py
OrderDao.py
Shopping_cartDao.py
GoodDao.py
CommentDao.py
Mini_Shopping_cartDao.py
¬entity文件夹∨:
User.py
Order.py
Shopping_cart.py
Good.py
Comment.py
Mini_Shopping_cart.py
然后,
我在那些dao操作的类中,引用了entity文件夹里面的实体类
from entity.User import User
我在那些service操作的类中,引用了dao文件夹里面的dao数据访问类
from dao.UserDao import UserDaoImpl
最后, 我在views.py开始编写后端网络api请求:
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
# 服务层
from .service.UserService import UserService
# Create your views here.
def index(request):
return HttpResponse('欢迎测试')
# 登录API
def login(request):
username = request.POST.get('username')
password = request.POST.get('password')
return JsonResponse(UserService().login(username,password))
在urls.py绑定请求路径:
# app/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("login", views.login, name="login")
]
一通操作猛如虎,一开测试凉凉
最后的解决办法只能是:
这个时候在回来写views.py
,urls.py
作为control
def login (self,username:str,password:str):
'''通过用户ID查询用户信息
@param 用户名,
@param 密码,
@return {User+Meta} 字典数据'''
user_id = UserDaoImpl().selectByNamePWD(username,password)
data = UserDaoImpl().selectByID(user_id)
meta = Meta("登录成功",200)
response = {
'data': data,
'meta': meta
}
json_str = json.dumps(response, default=lambda o: o.__json__() if isinstance(o, (User, Meta)) else None, ensure_ascii=False)
print(json_str)
return (json_str)
request.POST.GET('XXX')无法使用
先把request.body 用json转换出来,在.get('XXX')也不行
打印request.POST 打印 request.body 啥也没有
翻了大半天资料找不出方法
最后死马当活马医,瞎写用request.GET.GET('XXX')就可以,这就很神奇
def login(request):
username = request.GET.get('username')
password = request.GET.get('password')
print(request.body)
# print("=============================")
# concat = request.POST
# postBody = request.body
# print(concat)
# print(type(postBody))
# print(postBody)
# json_result = json.loads(postBody)
# print(json_result)
return HttpResponse(UserService().login(username,password),content_type="application/json")
使用 request.FILES.get('表单name')
即可获取到上传过来的文件
request.FILES.get('表单name').name
可以获取到文件名request.FILES.get('表单name').read()
可以读取文件的二进制数据流千万别去导入什么 项目名.settings的BASE_DIR
这玩意导进来空空如也
你只需要这样操作
一行获取当前项目的位置
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
再来一行拼接到文件目标位置
upload_path = BASE_DIR + '/static/picture/'+fileName
千万别搞什么os.path.join()来拼接路径,你的BASE_DIR会被吞的
具体实现代码:
import os
# 15 上传用户头像 http://127.0.0.1:8888/static/picture/xXxX.jpg
def UserPicture(request):
if request.method == 'POST':
fileName = request.FILES.get('file').name
# 当前脚本的绝对路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
upload_path = BASE_DIR + '/static/picture/'+fileName
fileData = request.FILES.get('file').read()
with open(upload_path, "wb+") as f:
f.write(fileData)
# do something else with the image if needed
response = {
'img': "http://127.0.0.1:8888/static/picture/"+fileName
}
json_str = json.dumps(response, default=lambda o: o.__json__() if isinstance(o, (str)) else None, ensure_ascii=False)
return HttpResponse(json_str,content_type="application/json")
```
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。