python 使用django库进行Web 开发(二)
如果获取信息成功,返回如下
{"ret": 0,"retlist": [{"address": "江苏省常州武进市白云街44号","id": 1,"name": "武进市 袁腾飞","phonenumber": "13886666666"},{"address": "北京海淀区","id": 4,"name": "北京海淀区代理 蔡国庆","phonenumber": "13990123456"}]
}
函数
mgr/.py:
# 导入 Customer
from common.models import Customerdef listcustomers(request):# 返回一个 QuerySet 对象 ,包含所有的表记录qs = Customer.objects.values()# 将 QuerySet 对象 转化为 list 类型# 否则不能 被 转化为 JSON 字符串retlist = list(qs)return JsonResponse({'ret': 0, 'retlist': retlist})
可以发现,无需转化数据为HTML, 后端的代码任务也大大减轻。
【2】 添加一个客户
mgr/.py:
def addcustomer(request):info = request.params['data']# 从请求消息中 获取要添加客户的信息# 并且插入到数据库中# 返回值 就是对应插入记录的对象 record = Customer.objects.create(name=info['name'] ,phonenumber=info['phonenumber'] ,address=info['address'])
【3】修改客户信息
根据接口文档,修改客户数据接口,前端提供的数据格式如下
{"action":"modify_customer","id": 6,"newdata":{"name":"武汉市桥北医院","phonenumber":"13345678888","address":"武汉市桥北医院北路"}
}
mgr/.py:
def modifycustomer(request):# 从请求消息中 获取修改客户的信息# 找到该客户,并且进行修改操作customerid = request.params['id']newdata = request.params['newdata']try:# 根据 id 从数据库中找到相应的客户记录customer = Customer.objects.get(id=customerid)except Customer.DoesNotExist:return {'ret': 1,'msg': f'id 为`{customerid}`的客户不存在'}if 'name' in newdata:customer.name = newdata['name']if 'phonenumber' in newdata:customer.phonenumber = newdata['phonenumber']if 'address' in newdata:customer.address = newdata['address']# 注意,一定要执行save才能将修改信息保存到数据库customer.save()return JsonResponse({'ret': 0})
【4】删除客户
根据接口文档,删除客户数据接口,前端只需要提供要删除的客户的ID。
数据格式如下
{"action":"del_customer","id": 6
}
我们可以使用如下的函数来处理
mgr/.py:
def deletecustomer(request):customerid = request.params['id']try:# 根据 id 从数据库中找到相应的客户记录customer = Customer.objects.get(id=customerid)except Customer.DoesNotExist:return {'ret': 1,'msg': f'id 为`{customerid}`的客户不存在'}# delete 方法就将该记录从数据库中删除了customer.delete()return JsonResponse({'ret': 0})
【5】临时取消 CSRF 校验
根据接口文档,添加客户 请求是个Post请求
POST /网站名/api/mgr/signin HTTP/1.1
Content-Type: application/x-www-form-urlencoded
注意,缺省创建的项目, 会启用一个 CSRF (跨站请求伪造) 安全防护机制。
在这种情况下, 所有的Post、PUT 类型的 请求都必须在HTTP请求头中携带用于校验的数据。
为了简单起见,我们先临时取消掉CSRF的 校验机制,等以后有需要再打开。
要临时取消掉CSRF的 校验机制,非常简单,只需要在 项目的配置文件 /.py 中 配置项 里 注释掉 ..csrf. 即可。
与前端进行集成
最终终前端和后端系统会集成在一起成为一个完整的系统。
部署到生产环境(生产环境就是正式的线上运营环境)运行的架构往往比较复杂。
开发环境下, 前后端分离的架构如何简单集成。
前端环境其实就是 一些前端的代码和资源文件,包括 js文件、html文件、css文件 还有 图片视频文件等。
我们模拟前端团队开发的 前端 系统 打包在这里 ,点击这里下载
下载好以后,可以解压该 .zip 文件到项目根目录下面,形成一个目录 。
该目录下面就是前端的 代码资源文件。
的开发环境也可以从浏览器访问这些前端的资源文件。
但是前端文件都是静态文件,需要我们配置一下的配置文件, 指定http请求如果访问静态文件,在哪个目录下查找。
注意,接下来我们配置 静态文件服务, 是 开发时 使用的 一种 临时方案 ,性能很低,这是方便我们调试程序用的。
开发模式:
前面讲过,正式部署web服务的时候,不应该这样干,应该采用其它方法,比如Nginx等。后面的教程会有详细的讲解如何使用Nginx 和 组合使用。现在,请打开 /urls.py 文件,在末尾 添加一个
from django.contrib import admin
from django.urls import path, include
# 静态文件服务
from django.conf.urls.static import static# from sales.views import listorders
# python manage.py runserver 0.0.0.0:80
urlpatterns = [path('admin/', admin.site.urls),path('sales/', include('sales.urls')),path('api/mgr/', include('mgr.urls')),] + static("/", document_root="./z_dist")
在url 路由中加入 前端静态文件的查找路径。
访问
#/
3、处理登录、登出请求 处理登录、登出请求
我们可以在mgr目录里面创建一个代码文件 .py,用来处理管理员登录和登出 的API 请求的。
当我们执行 创建数据库表时,根据,就会为我们创建 用户表 ,如下所示
..auth 这个app 已经 为我们做好了登录验证功能。
我们只需要使用这个app库里面的方法就可以了。
的文档就给出了登录和登出代码范例,我们稍微修改一下。
mgr/.py
from django.http import JsonResponsefrom django.contrib.auth import authenticate, login, logout# 登录处理
def signin(request):# 从 HTTP POST 请求中获取用户名、密码参数userName = request.POST.get('username')passWord = request.POST.get('password')# 使用 Django auth 库里面的 方法校验用户名、密码user = authenticate(username=userName, password=passWord)# 如果能找到用户,并且密码正确if user is not None:if user.is_active:if user.is_superuser:login(request, user)# 在session中存入用户类型request.session['usertype'] = 'mgr'return JsonResponse({'ret': 0})else:return JsonResponse({'ret': 1, 'msg': '请使用管理员账户登录'})else:return JsonResponse({'ret': 0, 'msg': '用户已经被禁用'})# 否则就是用户名、密码有误else:return JsonResponse({'ret': 1, 'msg': '用户名或者密码错误'})# 登出处理
def signout(request):# 使用登出方法logout(request)return JsonResponse({'ret': 0})
创建 url路由
系统中,浏览器登陆登录页面的url是
但是这不是 登录 API接口的url路径。
根据接口,管理员登录的API 路径是 /api/mgr/
前面的课程, 我们已经在总路由文件/urls.py中 添加了如下路由记录
# 凡是 url 以 api/mgr 开头的,
# 都根据 mgr.urls 里面的 子路由表进行路由
path('api/mgr/', include('mgr.urls')),
现在,我们只需要 在mgr 目录下面 的子路由文件 urls.py 里添加如下内容
mgr/urls.py
from mgr import customer
from django.urls import path
# 添加如下内容
from mgr import sign_in_outurlpatterns = [path('customers', customer.dispatcher),# 添加如下内容path('signin', sign_in_out.signin),path('signout', sign_in_out.signout),
]
这样就表示:
如果有HTTP请求 url是/api/mgr/就由 .py 里面的 函数处理,
如果有HTTP请求 url是/api/mgr/ 就由 .py 里面的 函数处理。
测试 【1】代码测试:
密码错误:
import pprint
import requestspayload = {'username': 'admin','password': '88888888'
}response = requests.post('http://localhost/api/mgr/signin',data=payload)pprint.pprint(response.json())
密码正确:
payload = {'username': 'admin','password': '123456'
}
【2】界面测试:
成功直接跳转
【3】 测试
:极客专属的接口协作管理工具
官网: