Mark's blog

Content



该系列文章源码来自: 博主第一次手撸博客(Django)
温馨提示: 该系列教程不提供前端布局和美化方面的内容, 博主本行是后端, 在我的项目中前端部分采用的框架是 Materialize, 是谷歌 Material Design 设计风格的前端框架, 欲知详情请点击上方提供的仓库地址, 源码采用WTFPL许可证开源


背景介绍

后端开发API化已经是不争的事实了, 再说多点还有前后端分离等等等等, 总之一句话, API一时爽, 一直API一直爽, 由于此次项目已经编写了多个API, 形成了我个人风格的代码风格, 所以我单独用一篇文章来介绍一下.


开发环境

  • 操作系统: Manjaro Linux 18
  • Python版本: Python3

    提示: Manjaro把Python3作为默认的Python版本, 其他发行版可能默认版本是Python2, 如果默认为Python2, 以下出现的Python和pip命令请使用python3和pip3

  • Django版本: v2.1.5
  • jQuery版本: v3.3.1

基本格式规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt

# XXX Api
# @login_required(redirect_field_name='', login_url='/login_page/') # 强制要求登录(可选)
@csrf_exempt # 允许跨域请求
def xxx_api(request):
if request.is_ajax():
if request.method == "POST":
return JsonResponse({"status": "OK"})
else:
return HttpResponseForbidden # 返回 403 Forbidden
else:
return HttpResponseServerError() # 一般情况返回 500 Server Error, 但是不一定就只能返回500

这样写的话, 逻辑结构非常清晰, 判断这个请求是否为ajax发送的请求 (如果不用ajax请去掉这一层if..else) => 判断这个请求是否为POST (需要GET方法就改成GET) => 是POST, 执行相应的业务逻辑代码 => 业务逻辑执行成功, 返回json数据给前端处理

根据具体的业务逻辑, 最后的返回语句可以在错误捕获和条件判断中灵活处理


实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from django.views.decorators.csrf import csrf_exempt

# Login Api
@csrf_exempt
def login_api(request):
if request.is_ajax():
if request.method == "POST":
name = request.POST['username']
pwd = request.POST['password']
user = authenticate(username=name, password=pwd)
if user is not None and user.is_active:
login(request, user)
return JsonResponse({
"status": '1',
"message": '登录成功'
})
else:
return JsonResponse({
"status": '0',
"message": '登录失败'
})
else:
return HttpResponseForbidden()
else:
return HttpResponseServerError()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from django.views.decorators.csrf import csrf_exempt

# Logout Api
@csrf_exempt
def logout_api(request):
if request.is_ajax():
if request.method == "POST":
signal = request.POST['signal']
if signal == "OUT":
try:
logout(request)
return JsonResponse({
"status": "OK"
})
except:
return JsonResponse({
"status": "WTF"
})
else:
return JsonResponse({
"status": "WTF"
})
else:
return HttpResponseForbidden
else:
return HttpResponseServerError()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt

# Image Upload Api
@csrf_exempt
@login_required(redirect_field_name='', login_url='/login_page/')
def image_upload_api(request):
if request.is_ajax():
if request.method == 'POST':
files = request.FILES.getlist('image')
try:
for file in files:
image_upload.objects.create(username=request.user, image=file)
return JsonResponse({
'status': 'OK'
})
except:
return JsonResponse({
'status': 'WTF'
})
else:
return HttpResponseForbidden()
else:
return HttpResponseServerError()

相信大家理解了之后马上就能举一反三了

 评论