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模拟登录12306的方法
Dec 30 Python
介绍Python中的__future__模块
Apr 27 Python
在Python中使用成员运算符的示例
May 13 Python
Python利用IPython提高开发效率
Aug 10 Python
Python selenium如何设置等待时间
Sep 15 Python
对python3 中方法各种参数和返回值详解
Dec 15 Python
Python使用百度api做人脸对比的方法
Aug 28 Python
Python单元测试工具doctest和unittest使用解析
Sep 02 Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
Jan 10 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 Python
python 密码学示例——理解哈希(Hash)算法
Sep 21 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
PHP5 安装方法
2006/10/09 PHP
PHP 强制下载文件代码
2010/10/24 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
php查询ip所在地的方法
2014/12/05 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
js实现各浏览器全屏代码实例
2018/07/03 Javascript
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python中的类学习笔记
2014/09/23 Python
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
python学习必备知识汇总
2017/09/08 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
python3字符串输出常见面试题总结
2020/12/01 Python
python中温度单位转换的实例方法
2020/12/27 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
Weblogic的布署方式
2013/08/23 面试题
电气工程自动化求职信
2014/03/14 职场文书
民事授权委托书范文
2014/08/02 职场文书
民用住房租房协议书
2014/10/29 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
Redis RDB技术底层原理详解
2021/09/04 Redis
Python中递归以及递归遍历目录详解
2021/10/24 Python