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实现烟花小程序
Jan 30 Python
python在回调函数中获取返回值的方法
Feb 22 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
QML使用Python的函数过程解析
Sep 26 Python
Jupyter加载文件的实现方法
Apr 14 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
如何创建一个Flask项目并进行简单配置
Nov 18 Python
Python 数据分析之逐块读取文本的实现
Dec 14 Python
Python如何实现Paramiko的二次封装
Jan 30 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 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
详细介绍PHP应用提速面面观
2006/10/09 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
js no-repeat写法 背景不重复
2009/03/18 Javascript
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
Windows下安装Scrapy
2018/10/17 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
解决yum对python依赖版本问题
2019/07/05 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
python里glob模块知识点总结
2021/01/05 Python
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
作风转变心得体会
2014/09/02 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
超市食品安全承诺书
2015/04/29 职场文书
员工辞职信范文大全
2015/05/12 职场文书
创业计划书之花店
2019/09/20 职场文书
JavaScript高级程序设计之基本引用类型
2021/11/17 Javascript