热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3+PyCharm+Django+DjangoRESTframework开发教程

一、说明自己一是想跟上潮流二是习惯于直接干三是没有人可以请教,由于这三点经常搞得要死要活。之前只简单看过没写过Diango,没看过DjangoRESTframework,今天一步到位直接上又撞

一、说明

自己一是想跟上潮流二是习惯于直接干三是没有人可以请教,由于这三点经常搞得要死要活。之前只简单看过没写过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、djangorestframeworkpygments、pytest四个包

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

 

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

 

四、使用总结

英文水平一般加上没用过Django也没写过REST,所以费了点周章但总算是完成了。

我们写程序工作总不会都是读取数据库表然后返回,主要还是一些交互逻辑代码,推测这些代码应该是写在view上在view决定好返回结果后,将结果传到serializers.Serializer的实现类(上面为了复用model我们实现的是serializers.ModelSerializer)完成序列化。更具体的还要再写写才好确定。

网上现有的很多教和感觉就是自己把英文版翻译成中文,但又不能很好地解框架到底在做什么,尤其是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


推荐阅读
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 1.修改CommonSettings.props文件下compute_xx,sm_xx,其中 ... [详细]
  • 关于extjs开发实战pdf的信息
    本文目录一览:1、extjs实用开发指南2、本 ... [详细]
author-avatar
紫色冰姬YOU
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有