Django 从零开始实现简单的restful应用

来源:互联网 发布:北大生命科学院知乎 编辑:程序博客网 时间:2024/05/21 06:37

安装Django

我是在windows上安装的,之后在linux上试一下再补充上来
可以通过pip直接安装

pip install django

需要使用到mysql 数据库

pip install mysqlclient

新建项目

安装以后一般会直接加到Path里可以直接运行

django-admin.py startproject myporject

但是有时候会这样没有效果
可以将django-admin.py考到目录下

python django-admin.py startproject myproject

这样也可以

django-admin startproject myproject

文件目录

│  manage.py└─myporject        settings.py        urls.py        wsgi.py        __init__.py

settings.py保存着整个项目的各种设置,比如数据库信息,app列表等等
urls.py内存放每个功能的链接

新建APP

可以直接新建一个.py文件来实现功能
但是需要进行数据库操作时必须创建一个app来实现
新建位置在manage.py所在目录

django-admin.py startapp myapp

目录结构

├─myapp│  │  admin.py│  │  apps.py│  │  models.py│  │  tests.py│  │  views.py│  │  __init__.py│  ││  └─migrations│          __init__.py

修改settings.py

这里我使用的是mysql

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME':'test',        "USER":'test',        "PASSWORD":'test',        'HOST':'localhost',        'PORT': '3306',    }}

将这个app加入到settings中

INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'myapp',]

models.py

空文件,声明数据类

from django.db import modelsclass Test(models.Model):    id = models.IntegerField(primary_key=True)    name = models.CharField(max_length=20, blank=True, null=True)    gender = models.CharField(max_length=1, blank=True, null=True)

这里默认的表名不是Test而是myapp_test

python manage.py migrate   # 创建表结构python manage.py makemigrations myapp  # 让 Django 知道我们在我们的模型有一些变更python manage.py migrate myapp   # 创建表结构

可以创建新表,并更新修改

连接原来就存在的表:

from django.db import modelsclass Test(models.Model):    id = models.IntegerField(primary_key=True)    name = models.CharField(max_length=20, blank=True, null=True)    gender = models.CharField(max_length=1, blank=True, null=True)    class Meta:        managed = False        db_table = 'test'

这样就映射到了test表

直接通过原有的表生成models

python manage.py inspectdb > myapp/models.py 

终于可以写代码了

在含有urls.py的myproject文件夹下新建testdb.py

测试应用

testdb.py:

from django.http import HttpResponsedef hello(request):    return HttpResponse("Hello Django")

urls.py:

from django.conf.urls import urlfrom . import testdburlpatterns = [    url(r'hello$', testdb.hello),]

运行

python manage.py runserver #默认8000 python manage.py runserver 8080#指定端口

结果

输入localhost:8000/hello
这里写图片描述

使用Django模板

django可以直接返回一个网页给客户端,并不restful
在根目录下新建一个template文件夹
在template下新建一个hello.html

<!DOCTYPE html><h1>{{hello}}</h1>

settings.py

TEMPLATES = [    {        'BACKEND': 'django.template.backends.django.DjangoTemplates',        'DIRS': [BASE_DIR+'/templates',],#修改这里为templates        'APP_DIRS': True,        'OPTIONS': {            'context_processors': [                'django.template.context_processors.debug',                'django.template.context_processors.request',                'django.contrib.auth.context_processors.auth',                'django.contrib.messages.context_processors.messages',            ],        },    },]

testdb.py

from django.shortcuts import renderdef hellohtml(request):    context ={}    context['hello'] = "hello Django emmmm"    return render(request,"hello.html",context)

在urls.py中加上此函数

restful的数据写入

接收post来的json数据

from django.http import HttpResponseimport jsonfrom Testmodel.models import Testfrom django.views.decorators.csrf import csrf_exempt@csrf_exemptdef postdata(request):    res = {}    try:        if request.method == "POST":            #request.body 为byte 转换为string            st = request.body.decode("utf-8")            res = json.loads(st)            task = {                'id':res['id'],                'name':res['name'],                'gender':res['gender']            }            test1 = Test(id = task['id'],gender =task['gender'],name = task['name'])            test1.save()            return HttpResponse('Successed!')        else:            return HttpResponse("no post ok?")    except Exception as e:        return HttpResponse(str(e))
  • import models时编译器可能报错,可能是由于这个包不在一个目录下,在settings中已经写入,django自动去寻找,无视报错信息
  • 表单表格后面要有一个{% csrf_token %}的标签。csrf 全称是 Cross Site Request Forgery。这是Django提供的防止伪装提交请求的功能。POST 方法提交的表格,必须有此标签。在方法前的代码为发来的数据加上这一部分
  • save()方法兼具插入和更新的功能,插入重复数据时并不会出错,此逻辑需要自己写

查询

转自菜鸟教程

    # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM    list = Test.objects.all()    # filter相当于SQL中的WHERE,可设置条件过滤结果    response2 = Test.objects.filter(id=1)     # 获取单个对象    response3 = Test.objects.get(id=1)     # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;    Test.objects.order_by('name')[0:2]    #数据排序    Test.objects.order_by("id")    # 上面的方法可以连锁使用    Test.objects.filter(name="runoob").order_by("id")    # 输出所有数据    for var in list:        response1 += var.name + " "    response = response1    return HttpResponse("<p>" + response + "</p>")

更新

test1 = Test.objects.get(id=1)test1.name = 'Google'test1.save()

删除

test1 = Test.objects.get(id=1)test1.delete()
原创粉丝点击