1、说明

本身一是想跟上潮流二是习惯于直接干三是没有人能够请教,因为这三点常常搞得要死要活。以前只简单看过没写过Diango,没看过Django REST framework,今天一步到位直接上又撞上了南墙。在此记一下以备忘,也但愿对后来者能有所帮助。本文至关于Django REST framework官方文档的从新实现。html

 

1.1 Django是什么

Django是当下流行的一个python语言的web框架,相似于java的struts2,(若是struts2太旧不懂那也能够理解为spring boot)。前端

 

1.2 Django REST framework是什么

Django相似于struts2,也就是说其是mvc模式的,也就是说其v是先后端强耦合的,但如今都讲REST。java

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

 

2、开发环境搭建

2.1 安装PyCharm+conda

 

2.2 在pycharm中新建项目

 

2.3 安装Django和Django REST framework

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

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

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

 

2.4 建立真正的Django项目

在前面中咱们已经建立了名称为DjangoTest的项目,但要注意只是咱们把名字命名为DjangoTest而已改项目到如今为止其实与Django无关。数据库

Django项目须要经过django-admin命令来建立;因此咱们要到项目所在文件夹下将现有DjangoTest文件夹删掉,而后用django-admin命令来从新建立DjangoTest。django

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

而django-admin命令的位置,咱们能够借助conda env list来查看DjangoTest虚拟环境所在的目录,而后加上\Scripts\django-admin.exe便是其位置。好比个人操做以下:

建立完成后目录结构以下:

 

 2.5 设置运行环境

django项目须要经过python manage.py runserver形式运行,咱们也须要配置成该形式。

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

Name----环境名称,本身随便填

Script path----manage.py所在的路径,改为本身的

Parameters----runserver,ip和端口若是须要直接追加在后边便可

必定要注意,后续不要随便在一个页面就右键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中运行):

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

 

 2.6.2 路由关联调整等

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

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

 

 

3、开发示例

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

3.1 建立model

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

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

 

3.2 建立model对应序例化类

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

 

3.3 设定路由

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

 

3.4 建立视图

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

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

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

requests post提交json:

curl post提交json:

 

3.5 建立model对应数据表

咱们在3.1中就建好了model,在官方文档中都是建好model就建对应数据表的,可是因为我对实现步骤作了调整若是在3.1中就建表,会因程序有错误而建立失败,因此咱们只能到这里才建立类据表。

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

 

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

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

 

 

3.6 向drest_test表插入数据

咱们一直说TestSerializer的做用是读取drest_test表的全部内容并序列化,在上一步中咱们建立好了drest_test;可是咱们在model的注释中也说过建立数据表时不会向表中插入数据,也就是说此时drest_test表虽建立好了但其是一个空表是没数据的,此时若是咱们运行程序并访问test连接那返回是空值。因此咱们要向drest_test表中插入数据。

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

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

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

 

3.7 启动程序并访问

咱们前面说过运行django项目run的必定要是咱们2.5中设置的运行环境,如今虽加项目进行了如些复杂的操做但项目仍是django项目仍是要运行那个环境(名为django)。

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

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

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

 

4、更直接的restful方法

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

好比为何必定要我建立model、为何必定要我建立model序列化类、为何必定要建立数据表、为何必定要向数据表中插入数据----总而言之,为何必定要涉及数据库?

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

 

4.1 设定路由

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

 

4.2 建立视图

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

 

4.3 启动程序并访问

和3.7同样运行manage.py,而后访问http://127.0.0.1:8000/test1/,结果以下图。

 

5、使用总结

英文水平通常加上没用过Django也没写过REST,因此费了点周章但总算是完成了。

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

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

 

参考: