搭建django向外提供接口的详细过程

一.django开发步骤(参考教程https://docs.djangoproject.com/zh-hans/2.2/):如下:

1.安装django :pip install Django 查看django版本:python -m django --version

2.创建项目:django-admin startproject mysite 启动项目:python manage.py runserve 创建子项目:python manage.py startapp polls(下一步是要在根 URLconf 文件中指定我们创建的 polls.urls 模块。在 mysite/urls.py 文件的 urlpatterns 列表里插入一个 include()

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

3、将App配置到Setting文件当中去(为了在我们的工程中包含这个应用,我们需要在配置类 INSTALLED_APPS 中添加设置。因为 PollsConfig 类写在文件 polls/apps.py 中,所以它的点式路径是 'polls.apps.PollsConfig'。在文件 mysite/settings.pyINSTALLED_APPS 子项添加点式路径后)

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

4、打开app的文件下的model.py文件,编写model,这里主要是编写web所需要的数据表

from django.db import models
from django.utils import timezone
import datetime
class Question(models.Model):
    def __str__(self):
        return self.question_text
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    def __str__(self):
        return self.choice_text
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

5、将数据导入到数据库当中去:python manage.py makemigrations XXX(python manage.py makemigrations polls

6、同步数据库:python manage.py migrate

7、打开admin.py文件,注册数据库,这里是将model注册到后台当中,以便用后台来对数据进行增删改

8、创建模板:在项目目录下创建templates文件夹,在文件夹下创建XXX.html模板文件

二.django整合mysql

设置setitng:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'python',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

主要涉及文件

views.py:

# _*_ coding: utf-8 _*_
from django.db import transaction
from django.http import HttpResponseRedirect,JsonResponse,HttpResponse
from django.shortcuts import get_object_or_404, render,render_to_response
from django.urls import reverse
from django.views import generic
from django.views.decorators.csrf import csrf_exempt
from .models import Choice, Question
import json
from django.core import serializers
import time
from django.db import connection
class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        """Return the last five published questions."""
        return Question.objects.order_by('-pub_date')[:5]


class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'


class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'
def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    print(question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the question voting form.
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
@csrf_exempt
def test_api(request):
    q = Question.objects.all()
    data={}
    data['list'] = json.loads(serializers.serialize("json", q))
    return JsonResponse(data, safe=False)
def add(request):
    t=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    print(t)
    a=Question(question_text="3",pub_date=t)
    a.save()
    # print("3")  # 打印 参数具体树枝
    return HttpResponse('增加第{}数据成功')
@csrf_exempt
#@transaction.atomic
def addPost(request):
    try:
        with transaction.atomic():
            if request.method == 'POST':
                p = json.loads(request.body)
                a = p.get("question_text")
                b = p.get("pub_date")
                qu = Question(question_text=str(a), pub_date=str(b))
                qu.save()
                Question.objects.extra("select * from polls_question")
                return HttpResponse('abc')
            else:
                return HttpResponse('abc')
    except Exception as e:
        return HttpResponse("出现错误<%s>" % str(e))


def Login(request):
    if request.method=="POST":
        a=request.POST.get("question_text")
        print(a)
        return JsonResponse({"name":"3"}, safe=False)
    else:
        return JsonResponse({"name": "4"}, safe=False)
def select(request):
    # cursor = connection.cursor()
    # # cursor.execute("insert into book(id,name,author) values (null ,'三国演义','罗贯中')")
    # cursor.execute("select * from polls_question")
    # rows = cursor.fetchall()
   # 惰性raw
    # for p in Question.objects.raw("select * from polls_question"):
    #     print(p)
      #  结果修改器 extra
    try:
        with transaction.atomic():
            raw = Question.objects.extra(select={'count': 'select count(*) from polls_question'})
            json_data = serializers.serialize("json", raw, ensure_ascii=False)
    except Exception as e:
        return HttpResponse("出现错误<%s>" % str(e))
    return JsonResponse(json_data, safe=False)
# django 分页的使用
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def listing(request):
    contact_list = Question.objects.all()
    paginator = Paginator(contact_list, 3)  # Show 25 contacts per page
    page = request.GET.get('page')

    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        contacts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        contacts = paginator.page(paginator.num_pages)
    json_data = serializers.serialize("json", contacts, ensure_ascii=False)
    return JsonResponse(json_data, safe=False)

urls.py:

from django.urls import path

from . import views
app_name = 'polls'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
    path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
    path('<int:question_id>/vote/', views.vote, name='vote'),
    path('test_api/', views.test_api, name='test_api'),
    path('add/', views.add, name='add'),
    path('addPost/', views.addPost, name='addPost'),
    path('login/', views.Login,name='login'),
    path('select/', views.select,name='select'),
    path('listing/', views.listing,name='listing')
]

总结:本文使用的 django2.2 主要是向外部提供简单接口

资源链接:https://download.csdn.net/download/qingshu0400/11100011

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值