• 售前

  • 售后

热门帖子
入门百科

Python3+PyCharm+Django+Django REST framework配置与简朴开发教程

[复制链接]
poney 显示全部楼层 发表于 2021-10-25 19:21:23 |阅读模式 打印 上一主题 下一主题
一、阐明

本身一是想跟上潮流二是风俗于直接干三是没有人可以请教,由于这三点常常搞得要死要活。之前只简单看过没写过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.jb51.net/article/205782.htm
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安装,下令如下
  1. conda activate DjangoTest
  2. pip install django
  3. pip install djangorestframework
  4. pip install pygments
  5. 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即是其位置。好比我的操纵如下:
  1. cd F:\PycharmProjects
  2. F:
  3. rmdir /s /q DjangoTest
  4. conda env list
  5. D:\Language\Miniconda3\envs\DjangoTest\Scripts\django-admin.exe startproject DjangoTest
复制代码
创建完成后目次结构如下:

 2.5 设置运行环境

django项目必要通过python manage.py runserver情势运行,我们也必要配置成该情势。
依次点击菜单----Run----Edit Configurations----左上角+号----Python,添加运行环境
  1. Name----环境名称,自己随便填
  2. Script path----manage.py所在的路径,改成自己的
  3. 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中运行):
  1. python manage.py startapp drest
复制代码
向Django项目注册drest,由于Django REST framework实在也以app情势注入所以也一同注册。主笔DjangoTest/settings.py找到INSTALLED_APPS追加以下内容:
  1. 'rest_framework',
  2. 'drest.apps.DrestConfig',
复制代码
 2.6.2 路由关联调整等

在drest目次下新建urls.py(内容先不写),然后在DjangoTest/usrls.py中包含它;即DjangoTest/usrls.py修改如下:
  1. from django.contrib import admin
  2. from django.urls import path
  3. from django.conf.urls import url, include
  4. urlpatterns = [
  5.   path('admin/', admin.site.urls),
  6.   url(r'^', include('drest.urls')),
  7. ]
复制代码
另外我们再在drest创建一个序列化文件serializers.py(内容先不写)用于后续序列化。到此我们的环境算搭建好了,项目目次结构如下:

三、开辟示例

前边我们已搭好了环境,创建了一个app----drest,这里我们即在drest上进行开辟。
3.1 创建model

这里的model不是mvc中的m,而是orm中的表对应的类,稍后数据库的表就是根据这个类来创建的。
主笔drest/model.py,写入以下内容:
  1. from django.db import models
  2. # Create your models here.
  3. class Test(models.Model):
  4.   # 这些在创建数据表时是表字段,括号内为字段对应属性
  5.   # 不过注意default属性,是说在实例化这个类时该字段默认是这个值,创建数据表时并不会当作一行括入数据表
  6.   created = models.DateTimeField(auto_now_add=True)
  7.   username = models.CharField(max_length=100, default='ls', )
  8.   password = models.CharField(max_length=100, default='toor', )
  9.   class Meta:
  10.     # 这个表示数据表的内容按创建时间排序
  11.     ordering = ('created',)
复制代码
3.2 创建model对应序例化类

编写drest/serializers.py写入以下内容:
  1. from rest_framework import serializers
  2. from drest.models import Test
  3. class TestSerializer(serializers.ModelSerializer):
  4.   class Meta:
  5.     # 此处指明本序列化对应的model
  6.     model = Test
  7.     # 此处指明从model对应数据表中读出哪些字段
  8.     # id字段我们在model中并没指明应该是框架自己创建的
  9.     # 另外我们还创建了created字段,但这里我们不加读取他,当然你要读取加上即可
  10.     fields = ('id', 'username', 'password')
复制代码
3.3 设定路由

主笔drest/urls.py,写入以下内容:
  1. from django.conf.urls import url
  2. from drest import views
  3. urlpatterns = [
  4.   url(r'^test/$', views.test),
  5. ]
复制代码
3.4 创建视图

在REST中视图已经不是mvc中的html与后端代码混淆的那种.jsp或.aspx页面了,所指的是生成并返回json/xml结果的东西(反而更像mvc中的m)。
在路由中我们设定链接test,指向test视图;我们这里来实现test视图,该视图利用3.2中的序列化类读取3.1中对应的数据表的全部内容实现序列化并返回。
  1. from django.http import JsonResponse
  2. from rest_framework.parsers import JSONParser
  3. from drest.serializers import Test
  4. from drest.serializers import TestSerializer
  5. def test(request):
  6.   """
  7.   List all code snippets, or create a new snippet.
  8.   """
  9.   if request.method == 'GET':# 这里应该是model对应的所有字段
  10.     test_obj = Test.objects.all()
  11.     # 序列化
  12.     serializer = TestSerializer(test_obj, many=True)
  13.     # 返回
  14.     return JsonResponse(serializer.data, safe=False)
  15.   # 此框架想实现原始REST的思想,如果是post就保存到数据库,这里暂且保留虽然我觉得不实用
  16.   elif request.method == 'POST':
  17.     data = JSONParser().parse(request)
  18.     serializer = TestSerializer(data=data)
  19.     if serializer.is_valid():
  20.       serializer.save()
  21.       return JsonResponse(serializer.data, status=201)
  22.     return JsonResponse(serializer.errors, status=400)
复制代码
在没有if代码对get/post等方法都进行同样的相应,假如要区分那就在在如if request.method == 'POST':分支内编写相应代码即可。为方便post测试附上requests和curl post提交的情势。
requests post提交json:
  1. import requests
  2. url = "http://127.0.0.1:8000/test1/"
  3. data = {"username":"ls", "password":"toor"}
  4. requests.post(url,json=data)
复制代码
curl post提交json:
  1. 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目次执行以下下令:
  1. python manage.py makemigrations drest
  2. 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:
  1. python manage.py shell
复制代码
为了更好地阐明model中default的作用我们插入两条数据:
  1. from drest.models import Test
  2. from drest.serializers import TestSerializer
  3. from rest_framework.renderers import JSONRenderer
  4. from rest_framework.parsers import JSONParser
  5. test = Test()
  6. test.save()
  7. test = Test(username='root')
  8. 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,写入以下内容:
  1. from django.conf.urls import url
  2. from drest import views
  3. urlpatterns = [
  4.   url(r'^test1/$', views.test1),
  5. ]
复制代码
4.2 创建视图

主笔drest/views.py追加test1方法:
  1. def test1(request):
  2.   # 要获取客户端提交的参数,可通过request.GET["param_name"]或request.POST["param_name"]获取,param_name是要获取的参数名
  3.   # 但要另外注意对post提交django默认是有csrf token校验的,要注意怎么处理好,最简单的方法是到setting.py中将'django.middleware.csrf.CsrfViewMiddleware'项注释掉
  4.   # username = request.GET["username"]
  5.   # username = request.POST["username"]
  6.   # 如果前端通过json格式提交,那么需要使用以下方式获取参数
  7.   # data = JSONParser().parse(request)
  8.   # username = data["username"]
  9.   # Django执行sql语句,第一种方法是依赖model的model.objects.get()等方法
  10.   # 获取第一条记录
  11.   # Test.objects.get(username="ls")
  12.   # 获取记录集合
  13.   # Test.objects.filter(username="ls")
  14.   # Django执行sql语句,第二种方法是直接执行sql语句
  15.   # cursor = connection.cursor()
  16.   # cursor.execute('select * from drest_test')
  17.   # 获取第一条记录
  18.   # row = cursor.fetchone()
  19.   # 遍历数据表所有记录
  20.   # for row in cursor.fetchall():
  21.   #   print(f"{row}")
  22.   dict1 = {}
  23.   dict1["id"] = 1
  24.   dict1["result"] = "success"
  25.   # JsonResponse()最正规的就是给他传一个字典
  26.   # 上一节传的serializer.data是一个列表反而不那么正规,传非字典参数要设置safe=False
  27.   return JsonResponse(dict1)
复制代码
4.3 启动程序并访问

和3.7一样运行manage.py,然后访问http://127.0.0.1:8000/test1/,结果如下图。

五、利用总结

在第三大节上,网上现有的许多教和感觉就是本身把英文版翻译成中文,但又不能很好地解框架到底在做什么,尤其是model实在是用来创建数据表和序列化类本质是读取数据表的内容并返回这两点,导致翻译得似是而非反而让人更难懂白框架的本质。
如第四大节所言,我们写程序工作总不会都是读取数据库表然后返回。增删改查尤其是跨数据表的增删改查照旧得在dao层中另行实现,作为窜联的逻辑代码则在view上实现;view调用dao,dao调用model。
更多关于 Django framework 相关教程请点击下面的相关链接

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作