Python3+PyCharm+Django+Django REST framework开发教程
一、说明
自己一是想跟上潮流二是习惯于直接干三是没有人可以请教,由于这三点经常搞得要死要活。之前只简单看过没写过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://www.cnblogs.com/lsdb/p/9121033.html
2.2 在pycharm中新建项目

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/)

或者通过系统菜单开启“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

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

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中运行):
python manage.py startapp drest

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

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(内容先不写)用于后续序列化。到此我们的环境算搭建好了,项目目录结构如下:

三、开发示例
前边我们已搭好了环境,创建了一个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/

3.5 创建model对应数据表
我们在3.1中就建好了model,在官方文档中都是建好model就建对应数据表的,但是由于我对实现步骤做了调整如果在3.1中就建表,会因程序有错误而创建失败,所以我们只能到这里才创建类据表。
指示在数据库中创建model对应的表,进入到manage.py目录执行以下命令:
python manage.py makemigrations drest
python manage.py migrate

执行完成后在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:
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()

此时查看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,结果如下图,返回结果与预期完全一致:

四、更直接的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/,结果如下图。

五、使用总结
英文水平一般加上没用过Django也没写过REST,所以费了点周章但总算是完成了。
在第三大节上,网上现有的很多教和感觉就是自己把英文版翻译成中文,但又不能很好地解框架到底在做什么,尤其是model其实是用来创建数据表和序列化类本质是读取数据表的内容并返回这两点,导致翻译得似是而非反而让人更难理解框架的本质。
如第四大节所言,我们写程序工作总不会都是读取数据库表然后返回。增删改查尤其是跨数据表的增删改查还是得在dao层中另行实现,作为窜联的逻辑代码则在view上实现;view调用dao,dao调用model。
参考:
https://www.runoob.com/django/django-tutorial.html
https://www.django-rest-framework.org/tutorial/1-serialization/
https://stackoverflow.com/questions/28241203/objects-all-not-returning-any-objects-in-django
Python3+PyCharm+Django+Django REST framework开发教程的更多相关文章
- Yii Framework 开发教程Zii组件-Tabs示例
有关Yii Tab类: http://www.yiichina.com/api/CTabView http://www.yiichina.com/api/CJuiTabs http://blog.cs ...
- Python3+PyCharm+PyQt5配置进行GUI开发
一.安装Python3.5以上版本. 链接:https://www.python.org/downloads/windows/ 二.安装PyQt5. 使用pip安装:1.进入 C:\Users\你的计 ...
- Python3+Django get/post请求实现教程
一.说明 之前写了一篇“Python3+PyCharm+Django+Django REST framework开发教程”,想着直接介绍rest就完了.但回过头来看,一是rest在解耦的同时将框架复杂 ...
- Django REST FrameWork中文教程2:请求和响应
从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...
- Django REST framework 中文教程1:序列化
建立环境 在我们做任何事情之前,我们将使用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在开展的任何其他项目保持良好的隔离. virtualenv envsource env/ ...
- Pycharm搭建Django开发环境
Pycharm搭建Django开发环境 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们大家都知道Django是python都一个web框架,因此大家需要自行安装python环境 ...
- Django 博客开发教程目录索引
Django 博客开发教程目录索引 本项目适合 0 基础的 Django 开发新人. 项目演示地址:Black & White,代码 GitHub 仓库地址:zmrenwu/django-bl ...
- Python、 Pycharm、Django安装详细教程(图文)
前言 这篇文章主要介绍了Python. Pycharm.Django安装详细教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. ...
- Django微信小程序后台开发教程
本文链接:https://blog.csdn.net/qq_43467898/article/details/83187698Django微信小程序后台开发教程1 申请小程序,创建hello worl ...
随机推荐
- Win10系统jdk环境变量配置方法
http://www.w10zj.com/Win10xy/Win10yh_5620.html
- 把ResNet-L152模型的ckpt文件转化为pb文件
import tensorflow as tf from tensorflow.python.tools import freeze_graph #os.environ['CUDA_VISIBLE_D ...
- JS构造函数原理与原型
1.创建对象有以下几种方式: ①.var obj = {}; ②.var obj = new Object(); ③.自定义构造函数,然后使用构造函数创建对象 [构造函数和普通函数的区别:函数名遵循大 ...
- RxJava 详解——简洁的异步操作(一)
随着越来越多的人开始提及 RxJava ,鉴于 RxJava 目前这种既火爆又神秘的现状,写下这篇文章来对 RxJava 做一个相对详细的.针对 Android 开发者的介绍. 这篇文章的目的有两个: ...
- j2ee高级开发技术课程第六周
一.jsf(java server faces)的运行原理(工作方式) 1.jsf应用是事件驱动的,当一个事件发生时(比如用户单击一个按钮),事件通知通过HTTP发往服务器,服务器端使用叫做Faces ...
- <转>jmeter(十八)关联之XPath Extractor
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- Java中常见的异常处理汇总
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的 ...
- jenkins git can't work ERROR: Timeout after 10 minutes ERROR: Error fetching remote repo 'origin'
Started by user Allen Running as Allen Building remotely on MISTestSrv2 (MIS) in workspace C:\jenkin ...
- 模块_pip、os模块
一个python文件就是一个模块 1.标准模块 python自带的模块就是标准模块,也就是可以直接import进来的就是标准模块 import json import random import da ...
- openGL学习----相机
0.参考:https://learnopengl-cn.github.io/01%20Getting%20started/09%20Camera/ 0.0其实相机就是搞清楚cameraPos,came ...