Python3+PyCharm+Django+Django REST framework配置与简单开发教程


Posted in Python onFebruary 16, 2021

一、说明

自己一是想跟上潮流二是习惯于直接干三是没有人可以请教,由于这三点经常搞得要死要活。之前只简单看过没写过Diango,没看过Django REST framework,今天一步到位直接上又撞上了南墙。在此记一下以备忘,也希望对后来者能有所帮助。本文相当于Django REST framework官方文档的重新实现。

1.1 Django是什么

Django是当下流行的一个python语言的web框架,类似于java的struts2,(如果struts2太旧不懂那也可以理解为spring boot)。

1.2 Django REST framework是什么

Django类似于struts2,也就是说其是mvc模式的,也就是说其v是前后端强耦合的,但现在都讲REST。

Django REST framework就是Django的REST化库,用于实现Django的REST化。

二、开发环境搭建

2.1 安装PyCharm+conda

参见:https://3water.com/article/205782.htm

2.2 在pycharm中新建项目

 Python3+PyCharm+Django+Django REST framework配置与简单开发教程

2.3 安装Django和Django REST framework

依次点开pycharm----菜单----file----settings----project----project interpreter,安装django、djangorestframework、pygments、pytest四个包

djangorestframework在conda-forge源中,如果找不到djangorestframework那应该是没添加conda-forge源的原因(中科大:https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/)

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

或者通过系统菜单开启“Anaconda Prompt”用pip安装,命令如下

conda activate DjangoTest

pip install django
pip install djangorestframework
pip install pygments
pip install pytest

2.4 创建真正的Django项目

在前面中我们已经创建了名称为DjangoTest的项目,但要注意只是我们把名字命名为DjangoTest而已改项目到现在为止其实与Django无关。

Django项目需要通过django-admin命令来创建;所以我们要到项目所在文件夹下将现有DjangoTest文件夹删掉,然后用django-admin命令来重新创建DjangoTest。

(前边创建的DjangoTest的意义,是更多是为了创建DjangoTest虚拟环境。虽然有点绕,但这是我针对Scrapy和Django这种鸡和蛋问题能想到的最好办法)

而django-admin命令的位置,我们可以借助conda env list来查看DjangoTest虚拟环境所在的目录,然后加上\Scripts\django-admin.exe即是其位置。比如我的操作如下:

cd F:\PycharmProjects
F:
rmdir /s /q DjangoTest
conda env list
D:\Language\Miniconda3\envs\DjangoTest\Scripts\django-admin.exe startproject DjangoTest

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

创建完成后目录结构如下:

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

 2.5 设置运行环境

django项目需要通过python manage.py runserver形式运行,我们也需要配置成该形式。

依次点击菜单----Run----Edit Configurations----左上角+号----Python,添加运行环境

Name----环境名称,自己随便填

Script path----manage.py所在的路径,改成自己的

Parameters----runserver,ip和端口如果需要直接追加在后边即可

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

一定要注意,后续不要随便在一个页面就右键run/debug,而是不管修改什么文件在什么位置都要run/debug上边这个环境,不然运行不起来。(一直报错django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.)

2.6 将Django REST framework集成到Django

上边我们创建了Django项目,至于Django REST framework只是安装并没有开始操作,下边我们开始使用Django REST framework对上边的Django项目进行REST化改造。

一般而言我们不直接大幅修改Django项目的文件,而是新建一个APP实现REST,然后原来的Django项目文件只写一些包含命令即可。所谓APP可以理解为子文件夹或者一个新线程。

为了更好地证明我们的程序是能很好运行的,我这里会改用和官方例子不一样的名称包括app名称model名称等;并尽可能说明每个操作本质是在做什么。 

2.6.1 注册drest和Django REST framework

首先,进入到manage.py所在目录新建一个app(注意打开的cmd中的python和pycharm中的python同为python3不然运行就报错了,我这里直接在前边的Anaconda Prompt中运行):

python manage.py startapp drest

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

向Django项目注册drest,由于Django REST framework其实也以app形式注入所以也一同注册。编缉DjangoTest/settings.py找到INSTALLED_APPS追加以下内容:

'rest_framework',
'drest.apps.DrestConfig',

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

 2.6.2 路由关联调整等

在drest目录下新建urls.py(内容先不写),然后在DjangoTest/usrls.py中包含它;即DjangoTest/usrls.py修改如下:

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include

urlpatterns = [
  path('admin/', admin.site.urls),
  url(r'^', include('drest.urls')),
]

另外我们再在drest创建一个序列化文件serializers.py(内容先不写)用于后续序列化。到此我们的环境算搭建好了,项目目录结构如下:

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

三、开发示例

前边我们已搭好了环境,创建了一个app----drest,这里我们即在drest上进行开发。

3.1 创建model

这里的model不是mvc中的m,而是orm中的表对应的类,稍后数据库的表就是根据这个类来建立的。

编缉drest/model.py,写入以下内容:

from django.db import models

# Create your models here.
class Test(models.Model):
  # 这些在创建数据表时是表字段,括号内为字段对应属性
  # 不过注意default属性,是说在实例化这个类时该字段默认是这个值,创建数据表时并不会当作一行括入数据表
  created = models.DateTimeField(auto_now_add=True)
  username = models.CharField(max_length=100, default='ls', )
  password = models.CharField(max_length=100, default='toor', )

  class Meta:
    # 这个表示数据表的内容按创建时间排序
    ordering = ('created',)

3.2 创建model对应序例化类

编写drest/serializers.py写入以下内容:

from rest_framework import serializers
from drest.models import Test

class TestSerializer(serializers.ModelSerializer):
  class Meta:
    # 此处指明本序列化对应的model
    model = Test
    # 此处指明从model对应数据表中读出哪些字段
    # id字段我们在model中并没指明应该是框架自己创建的
    # 另外我们还创建了created字段,但这里我们不加读取他,当然你要读取加上即可
    fields = ('id', 'username', 'password')

3.3 设定路由

编缉drest/urls.py,写入以下内容:

from django.conf.urls import url
from drest import views

urlpatterns = [
  url(r'^test/$', views.test),
]

3.4 创建视图

在REST中视图已经不是mvc中的html与后端代码混淆的那种.jsp或.aspx页面了,所指的是生成并返回json/xml结果的东西(反而更像mvc中的m)。

在路由中我们设定链接test,指向test视图;我们这里来实现test视图,该视图使用3.2中的序列化类读取3.1中对应的数据表的所有内容实现序列化并返回。

from django.http import JsonResponse
from rest_framework.parsers import JSONParser
from drest.serializers import Test
from drest.serializers import TestSerializer

def test(request):
  """
  List all code snippets, or create a new snippet.
  """
  if request.method == 'GET':# 这里应该是model对应的所有字段
    test_obj = Test.objects.all()
    # 序列化
    serializer = TestSerializer(test_obj, many=True)
    # 返回
    return JsonResponse(serializer.data, safe=False)

  # 此框架想实现原始REST的思想,如果是post就保存到数据库,这里暂且保留虽然我觉得不实用
  elif request.method == 'POST':
    data = JSONParser().parse(request)
    serializer = TestSerializer(data=data)
    if serializer.is_valid():
      serializer.save()
      return JsonResponse(serializer.data, status=201)
    return JsonResponse(serializer.errors, status=400)

在没有if代码对get/post等方法都进行同样的响应,如果要区分那就在在如if request.method == 'POST':分支内编写响应代码即可。为方便post测试附上requests和curl post提交的形式。

requests post提交json:

import requests

url = "http://127.0.0.1:8000/test1/"
data = {"username":"ls", "password":"toor"}
requests.post(url,json=data)

curl post提交json:

curl -H "Content-Type:application/json" -X POST --data '{"username": "ls","password":"toor"}' http://127.0.0.1:8000/test1/

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

3.5 创建model对应数据表

我们在3.1中就建好了model,在官方文档中都是建好model就建对应数据表的,但是由于我对实现步骤做了调整如果在3.1中就建表,会因程序有错误而创建失败,所以我们只能到这里才创建类据表。

指示在数据库中创建model对应的表,进入到manage.py目录执行以下命令:

python manage.py makemigrations drest
python manage.py migrate

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

执行完成后在manage.py同级目录下可以看到一个db.sqlite3文件,该文件是一个sqlite3数据库。

使用SQLiteStudio等工具打开,可以看到有一个dres_test的表其字段“created”、“username”、“password”正是我们在model中配置好的。

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

3.6 向drest_test表插入数据

我们一直说TestSerializer的作用是读取drest_test表的所有内容并序列化,在上一步中我们创建好了drest_test;但是我们在model的注释中也说过创建数据表时不会向表中插入数据,也就是说此时drest_test表虽创建好了但其是一个空表是没数据的,此时如果我们运行程序并访问test链接那返回是空值。所以我们要向drest_test表中插入数据。

进入到manage.py目录执行以下命令启动shell:

python manage.py shell

为了更好地说明model中default的作用我们插入两条数据:

from drest.models import Test
from drest.serializers import TestSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

test = Test()
test.save()
test = Test(username='root')
test.save()

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

此时查看drest_test表的内容,如下所示正是我们插入的两条数据:

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

3.7 启动程序并访问

我们前面说过运行django项目run的一定要是我们2.5中设置的运行环境,现在虽加项目进行了如些复杂的操作但项目还是django项目还是要运行那个环境(名为django)。

pycharm切换到manage.py----在其上右键----选择Run ‘django',程序成功运行如下:

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

 我们看到监听地址为http://127.0.0.1:8000/,而我们设置的路由是test

打开浏览器访问http://127.0.0.1:8000/test,结果如下图,返回结果与预期完全一致: 

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

四、更直接的restful方法

上一大节的示例依据官方示例整理而成,整个流程虽然还算清楚,但给人一种复杂感。

比如为什么一定要我创建model、为什么一定要我创建model序列化类、为什么一定要创建数据表、为什么一定要向数据表中插入数据----总而言之,为什么一定要涉及数据库?

并非所有请求都要涉及数据库的,或者我就只想一个请求过来然后直接简单地返回随便一个数,那该如何写呢。以test1请求为例。

4.1 设定路由

编缉drest/urls.py,写入以下内容:

from django.conf.urls import url
from drest import views

urlpatterns = [
  url(r'^test1/$', views.test1),
]

4.2 创建视图

编缉drest/views.py追加test1方法:

def test1(request):
  # 要获取客户端提交的参数,可通过request.GET["param_name"]或request.POST["param_name"]获取,param_name是要获取的参数名
  # 但要另外注意对post提交django默认是有csrf token校验的,要注意怎么处理好,最简单的方法是到setting.py中将'django.middleware.csrf.CsrfViewMiddleware'项注释掉
  # username = request.GET["username"]
  # username = request.POST["username"]
  # 如果前端通过json格式提交,那么需要使用以下方式获取参数
  # data = JSONParser().parse(request)
  # username = data["username"]
  # Django执行sql语句,第一种方法是依赖model的model.objects.get()等方法
  # 获取第一条记录
  # Test.objects.get(username="ls")
  # 获取记录集合
  # Test.objects.filter(username="ls")
  # Django执行sql语句,第二种方法是直接执行sql语句
  # cursor = connection.cursor()
  # cursor.execute('select * from drest_test')
  # 获取第一条记录
  # row = cursor.fetchone()
  # 遍历数据表所有记录
  # for row in cursor.fetchall():
  #   print(f"{row}")
  dict1 = {}
  dict1["id"] = 1
  dict1["result"] = "success"
  # JsonResponse()最正规的就是给他传一个字典
  # 上一节传的serializer.data是一个列表反而不那么正规,传非字典参数要设置safe=False
  return JsonResponse(dict1)

4.3 启动程序并访问

和3.7一样运行manage.py,然后访问http://127.0.0.1:8000/test1/,结果如下图。

Python3+PyCharm+Django+Django REST framework配置与简单开发教程

五、使用总结

在第三大节上,网上现有的很多教和感觉就是自己把英文版翻译成中文,但又不能很好地解框架到底在做什么,尤其是model其实是用来创建数据表和序列化类本质是读取数据表的内容并返回这两点,导致翻译得似是而非反而让人更难理解框架的本质。

如第四大节所言,我们写程序工作总不会都是读取数据库表然后返回。增删改查尤其是跨数据表的增删改查还是得在dao层中另行实现,作为窜联的逻辑代码则在view上实现;view调用dao,dao调用model。

更多关于 Django framework 相关教程请点击下面的相关链接

Python 相关文章推荐
跟老齐学Python之使用Python操作数据库(1)
Nov 25 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
浅析Python中的赋值和深浅拷贝
Aug 15 Python
使用pandas读取csv文件的指定列方法
Apr 21 Python
pytorch 自定义数据集加载方法
Aug 18 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
Mar 30 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
基于PyTorch中view的用法说明
Mar 03 Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 #Python
Python3+Django get/post请求实现教程详解
Feb 16 #Python
Python3+Flask安装使用教程详解
Feb 16 #Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 #Python
Python LMDB库的使用示例
Feb 14 #Python
python 装饰器重要在哪
Feb 14 #Python
python爬虫如何解决图片验证码
Feb 14 #Python
You might like
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
php实现mysql事务处理的方法
2014/12/25 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
php 浮点数比较方法详解
2017/05/05 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
js获取当月最后一天实例代码
2013/11/19 Javascript
理解javascript异步编程
2016/01/27 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
Angular2库初探
2017/03/01 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
Python 常用 PEP8 编码规范详解
2017/01/22 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
音乐表演专业毕业生求职信
2013/10/14 职场文书
信息技术专业个人自我评价
2013/12/11 职场文书
公司企业表扬信
2014/01/11 职场文书
航空学院求职信
2014/06/11 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
离婚协议书范文2014
2014/10/16 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
公司档案管理制度
2015/08/05 职场文书
校园安全学习心得体会
2016/01/18 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书