天天看点

python中web开发框架Django的学习

1. 2020-10-10

  • django大致是类似于java中spring那一套,但是更简单,基本上不需要配置相关文件就可以直接上手
  • 通过pip下载django
pip install django
           
  • 项目开始,建立工作文件夹workproject
cd workproject的位置
django-admin startproject projectname
           

projectname下面的url和setting是常有的东西,前者主要是配置路由,就是前端发过来的请求交给app里面view中的哪个函数去处理。当然这里是总的路由,在app里面新建子路由

  • 创建app,现切换到项目下
cd /projectname
python3 manager.py startapp appname
           

注意app大概就是一个处理对象,比如app里面的view.py就是具体处理响应函数所在的包

  • 服务器的运行,切换在projectname下
python manager.py runserver 0.0.0.0:80
           

可能会报错

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
           

只需下载

python manage.py migrate
           

注意,要在浏览器中访问可以去跟项目名相同的文件下面找到setting.py,然后设置

在浏览器中输入localhost即可访问成功(有点tomcat那个味儿)

  • 和数据库的连接,可以使用内置的sqlite3,在运行了上述命令之后,文件夹后面会相关sql文件夹
  • 因为语言关系的高封装性,我们不需要写任何语句,当想要创建某个表的时候,我们只需要将该类继承models里面的Model类,继承后使用类似如下方式进行相关字段的创建
#姓名
name = models.CharField(max_length=200)
#电话号码
phonenumber = models.CharField(max_length=200)
#地址
address = models.CharField(max_length=200)
           

然后需要运行以下以下两段语句进行提交,提交后可以在sql管理工具里面看到相关的表的生成

#生成同步数据库的脚本:
python manage.py makemigrations  
#同步数据库:  
python manage.py migrate   
           

2. 2020-10-11

  • 注意上次提交的表单是customer表,也就是说数据库里面生成了一张customer,但其实其内置了很多张表,比如usr表等等,要注意区分!
  • 首先是数据的列出、添加、修改、删除。因为其框架的安全性质(CRSF),我们先将setting.py里面涉及内容先注释,待测试完毕再开启
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
           
  • 同时,因为防止view.py里面太过于复杂,再建立一个customer.py文件专注于处理customer的相关操作,具体项目的urls.py和app(mgr)的urls.py怎么写,需要根据具体api规范来操作,以我为例,管理员操作用户发过来的请求为api/mgr/customers,所以在总的urls.py里面新加path

在app(mgr)的urls.py里面添加

path('customers',dispatcher),
           

当然,我们可以直接在view.py里面写处理该请求的dispatcher函数,但需要注意的是为了更加模块化,不要一昧将所有函数全部写在view.py中,我们可以在mgr下面再新建一个customer.py,该文件专注于处理管理员操作用户请求,即我们的dispatcher。可能会有人问:一个请求怎么做到增删查改的!其实这里就是Restful编程风格,其采用不同的请求方式来实现同一个请求实现不同的功能,所以dispatcher中我们需要来分流,识别他们再分别实现不同功能!

def dispatcher(request):
	识别请求方式
	根据不同的方式用不同的函数处理不同需要
           
  • 识别请求方式
# GET请求 参数在url中,同过request 对象的 GET属性获取
if request.method == 'GET':
    request.params = request.GET
# POST/PUT/DELETE 请求 参数 从 request 对象的 body 属性中获取
elif request.method in ['POST','PUT','DELETE']:
    # 根据接口,POST/PUT/DELETE 请求的消息体都是 json格式
    request.params = json.loads(request.body)
           
  • 根据不同的action分派给不同的函数进行处理
action = request.params['action']
if action == 'list_customer':
    return listcustomers(request)
elif action == 'add_customer':
    return addcustomer(request)
elif action == 'modify_customer':
    return modifycustomer(request)
elif action == 'del_customer':
    return deletecustomer(request)

else:
    return JsonResponse({'ret': 1, 'msg': '不支持该类型http请求'})
           

可能会有人问这个action是什么,其实这就是根据api,即前端会给说清楚前端请求的数据的json格式各字段的意思,比如本次的action就是调用函数的名字,这些都是根据api来具体操作的

  • 下面就是核心了,即具体的每一个函数操作内容
  • listcustomers()
def listcustomers(request):
    # 返回一个 QuerySet 对象 ,包含所有的表记录,高度封装,返回customer表的全部内容
    qs = Customer.objects.values()

    # 将 QuerySet 对象 转化为 list 类型
    # 否则不能 被 转化为 JSON 字符串
    retlist = list(qs)

    return JsonResponse({'ret': 0, 'retlist': retlist})
           

这里的Customer其实就是最开始我们生成数据库表的那一个类,JsonResponse()函数就是将一个字典转化为json格式,列出语句核心

  • addcustomer()
def addcustomer(request):
    info = request.params['data']
    # 从请求消息中 获取要添加客户的信息
    # 并且插入到数据库中
    # 返回值 就是对应插入记录的对象 
    record = Customer.objects.create(name=info['name'] ,
                            phonenumber=info['phonenumber'] ,
                            address=info['address'])
    return JsonResponse({'ret': 0, 'id':record.id})
    
           

核心就是Customer.objects.create(),传入相关的字段

  • deletecustomer()
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})
           

核心:Customer.objects.get(),拿到指定id的customer再根据id删除该条记录,最后记得customer.delete()

  • modifycustomer()
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()
           

核心:Customer.objects.get(),拿到指定id的customer再根据id修改该条记录,返回的是一个字典,最后记得customer.save()保存!