首页 > 其他分享 >项目接口实现

项目接口实现

时间:2022-11-07 22:57:05浏览次数:80  
标签:git 浏览器 请求 项目 实现 接口 models import verbose

项目接口实现

后台主页模块接口

由原型图可分析,后台首页需要轮播图接口,推荐课程接口

软件开发模式

  • 瀑布模式

    如:bbs项目

    先设计数据库,等数据库全部设计完毕后,开始写项目

  • 敏捷开发模式

    如 路飞,管理软件

    此模式是 写一块设计一块数据库

  • 关于软件开发模式的详细理解请点击下方链接查看

    https://zhuanlan.zhihu.com/p/444741981

创建轮播图表

创建一个app,在首页写轮播图表

在命令行创建apppython ../../manage.py startapp home

编写公共的字段的表 BaseMosel

有些字段,别的表也会有,所以抽出一个公共的Base表,只要使用这些字段,就继承这个表(类似于AbstractUser)

utils/models下创建公共表字段

from django.db import models
class BaseModel(models.Model):
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    updated_time = models.DateTimeField(auto_now=True, verbose_name='最后更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')  # 软删除,不真正的删除数据,而使用字段控制
    is_show = models.BooleanField(default=True, verbose_name='是否上架')
    orders = models.IntegerField(verbose_name='优先级')

    class Meta:
        # 如果表迁移,这个表就会生成,咱们不能再数据库生成这个表,就需要加这句
        abstract = True  # 虚拟表,只用来做继承,不在数据库生成

在相应的app下创建表数据

创建轮播图表 banner

# 继承公共表字段创建轮播图表
from utils.models import BaseModel

class Banner(BaseModel):
    # 图片地址,图片名,图片介绍,link地址
    title = models.CharField(max_length=16, unique=True, verbose_name='名称')
    image = models.ImageField(upload_to='banner', verbose_name='图片')
    link = models.CharField(max_length=64, verbose_name='跳转链接')  # /course/
    info = models.TextField(verbose_name='详情')  # 也可以用详情表

    class Meta:
        db_table = 'luffy_banner'
        verbose_name_plural = '轮播图表'

    def __str__(self):
        return self.title

迁移两条命令

  1. python manage.py makemigrations

  2. python manage.py migrate

轮播图接口编写

路由分发

  • 总路由

    urls.py

    from django.contrib import admin
    from django.urls import path, include
    from home import views
    from django.views.static import serve
    from django.conf import settings
    urlpatterns = [
        path('admin/', admin.site.urls),
        
        # 主页分路由 地址127.0.0.1:8080/api/v1/home/
        path('api/v1/home/', include('home.urls')),
    
        # 开启media的访问
        path('media/<path:path>', serve, kwargs={'document_root': settings.MEDIA_ROOT}),
        # re_path('^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT})
    
    ]
    
  • 分路由

    home的app中新建urls.py

    from . import views
    from rest_framework.routers import SimpleRouter
    router = SimpleRouter()
    router.register('banner', views.BannerView, 'banner')
    urlpatterns = [
    ]
    urlpatterns += router.urls
    

序列化类 serializer.py

from .models import Banner
from rest_framework import serializers

class BannerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Banner
        fields = ['title', 'image', 'link']

全局调用 ListModelMixin更改list数据

在utils下创建view.py

from rest_framework.mixins import ListModelMixin
from utils.response import APIResponse
class CommonListModelMixin(ListModelMixin):
    def list(self, request, *args, **kwargs):
        res = super().list(request, *args, **kwargs)
        return APIResponse(result=res.data)

此后再调用更改list方法可以直接继承CommonListModelMixin即可

在相应的app下的视图函数view.py

from rest_framework.viewsets import GenericViewSet
# 获取所有
from utils.views import CommonListModelMixin
from rest_framework.response import Response

class BannerView(GenericViewSet, CommonListModelMixin):
    queryset = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')
    serializer_class = BannerSerializer

录入数据

1.下载simpleui,并在配置文件中 注册app,令其国际化

2.创建超级用户

3.在后台录入数据

跨域问题

前后端交互会存在跨域问题

跨域问题出现的原因

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现

请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.

解析:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据
浏览器上就会报错,这个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险

解决跨域问题

  • 前端代理

  • nginx代理

  • cors解决跨域

cors解决跨域详情

  • 什么是cors

    cors是跨域资源共享,后端技术,核心就是在响应头中加入数据,允许浏览器接受数据

    CORS需要浏览器和服务器同时支持,IE浏览器不能低于IE10

  • cors的基本流程

    浏览器将CORS请求分成两类:

    ①简单请求(simple request)

    ​ 浏览器发出CORS简单请求,只需要在头信息之中增加一个Access-Control-Allow-Origin字段

    ②非简单请求(not-so-simple request)

    ​ 浏览器发出CORS非简单请求,会在正式通信之前,先发送一个options请求,称为”预检”请求。

    ​ 浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,如果运行,再发真正的请求

简单请求和非简单请求

  • 简单请求

    满足下面两种情况,就是简单请求

    1.请求方法是以下三种方法之一:[ HEAD, GET, POST]

    2.HTTP的请求头信息不超出以下几种字段:

    [ Accept Accept-LanguageContent-Language Last-Event-IDContent-Type、]

    Content-Type:只限于三个值application/x-www-form-urlencodedmultipart/form-datatext/plain

  • 非简单请求

    非简单请求 需要先发送一个options请求,简而言之不算简单请求的就是非简单请求

使用cors解决跨域

1.使用cors技术,在配置文件中编写

1.注册app
INSTALLED_APPS=['corsheaders',]

2.添加中间件
MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware',]

2.cors的配置
# 允许所有域
CORS_ORIGIN_ALLOW_ALL = True
# 允许的请求方式
CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)
# 允许请求头带
CORS_ALLOW_HEADERS = (
    'accept-encoding',
    'authorization',
    'content-type',
    'origin',
    'user-agent',
    'x-csrftoken',
    'token'
)

2.在process_response中编写解决方法

def test(request):
    print(request.method)
    # 如果自己写,需要写个中间件,每个请求都会走,在process_response中写入下面的代码即可
    # 解决简单请求
    res=HttpResponse('ok')
    res['Access-Control-Allow-Origin']='*'
    # 解决非简单请求
    if request.method=='OPTIONS':
        res['Access-Control-Allow-Headers'] = 'Content-Type'
    return res

3.第三方模块,解决了这个问题,只需要集成进来,使用即可

①安装django-cors-headers

②注册app

③中间件加入

④配置文件配置

具体查看上述内容

自定义配置

有些公共配置信息,放到单独一个配置文件中

在settings文件夹下创建common_settings.py

# 轮播图显示的条数
BANNER_COUNT = 3

在配置文件dev.py 中导入

from settings.common_settings import *

查询所有轮播图接口中

queryset = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')[:settings.BANNER_COUNT]

git介绍和安装

在后端中写好一个接口,完成了一个功能,要把代码提交到远程仓库

公司里协同开发,版本管理需要使用软件: svn,git

git 的下载

下载路径 : https://git-scm.com/downloads

任意位置点右键,如果有两个东西(【git gui here】 【git bash here】),表示安装完成

image-20221107155607292

pycharm中配置git

  • github , gitee开源软件

  • 下载成zip,使用pycharm打开

  • 使用pycharm直接拉下来,打开---》配置pycharm

    ​ settings中搜索git,把git安装可执行文件配置好

  • 以后下载开源软件:vcs--->get from version contral--->填入路径---》clone下来即可

svn,git ,github,gitee,gitlab

# svn:版本管理软件,它是集中式的版本管理,必须有个svn的服务端,服务端如果过来,svn就用不了了
# git :版本管理软件,它是一个分布式的版本管理,每个客户端都可以作为服务端,即便服务端挂了,也能进行版本管理(本地管理)
# github:全球最大的开源远程git仓库,全球最大的开源仓库,git远程仓库
	-如果我要写开源软件,本地装git,把代码提交到github
    -python监控公司代码有没有被传到github
# gitee:中国最大的开源软件仓库   【私有仓库,花钱买空间】
# gitlab:公司内部的远程仓库,运维搭建维护

标签:git,浏览器,请求,项目,实现,接口,models,import,verbose
From: https://www.cnblogs.com/nirvana001/p/16867810.html

相关文章