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和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
对python 矩阵转置transpose的实例讲解
Apr 17 Python
解决pyqt5中QToolButton无法使用的问题
Jun 21 Python
python 设置输出图像的像素大小方法
Jul 04 Python
python单例模式的多种实现方法
Jul 26 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
Flask框架单例模式实现方法详解
Jul 31 Python
python json.dumps() json.dump()的区别详解
Jul 14 Python
python subprocess pipe 实时输出日志的操作
Dec 05 Python
Python中seaborn库之countplot的数据可视化使用
Jun 11 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的引用计数机制
2013/06/14 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
PHP排序算法类实例
2015/06/17 PHP
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
js字符串倒序的实例代码
2018/11/30 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
Python实现partial改变方法默认参数
2014/08/18 Python
Python找出9个连续的空闲端口
2016/02/01 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
django框架两个使用模板实例
2019/12/11 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
linux面试相关问题
2013/04/28 面试题
大学本科生的个人自我评价
2013/12/09 职场文书
四风对照检查材料范文
2014/09/27 职场文书
信仰纪录片观后感
2015/06/08 职场文书