21. Blog接口开发
一般的系统由登录、增删改查所组成。我们的Blog同样如此。我们会开发登录、创建博客、删除博客、修改博客、查询博客等功能。话不多说,我们直接展开实践吧。
思路分析
- 创建项目。既然我们要创建一个blog,那么我们第一步肯定是创建一个django项目。
- 创建应用。我们上面已经学过,应用是放在django项目中的。
- 设计数据库。我们之前提到过MTV设计模式,其中M我们没有用到。但是在Blog系统中我们将会用到。因为我们会创建博客,所以会有数据存储。
- 编写视图函数V。
- 配置URL。
代码实现
1.创建项目 django-admin blog
2.创建应用 django-admin startproject article,2.blog/settings.py添加article应用,如下代码所示:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'article',
]
3.设计数据库 在article/modles.py输入如下代码:
from django.db import models
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=10, )
author = models.CharField(max_length=10)
content = models.CharField(max_length=500)
date_publish = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
备注:__str__的作用是美化打印出来的结果,使人类更方便查看。
4.新建blog数据库 打开wampserver、Navicat,新建blog数据库

5.连接本地数据库 因为我们要使用Navicat连接数据库,所以我们需要对我们的项目进行一些修改,打开settings.py文件,注释粗体部分代码,添加数据库配置代码,如下所示:
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
# 新增代码
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
'NAME': 'blog',
'USER': 'root',
'PASSWORD': '',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
6.在.../blog/init.py 目录下添加:
import pymysql
pymysql.install_as_MySQLdb()
7.数据库迁移 执行python manage.py makemigrations,再执行python manage.py migrate
python manage.py makemigrations
python manage.py migrate
8.创建用户。因为我们接口实现登录的功能,所以我们需要创建用户 。
F:\新建文件夹\blog>python3 manage.py createsuperuser
Username (leave blank to use 'administrator'): admin
Email address: admin@qq.com
Password:
Password (again):
Superuser created successfully.
9.编写视图函数V,打开article/views.py,输入如下代码
from django.http import JsonResponse
from .models import Article
from django.contrib import auth
# 登录接口
def login(request):
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
if username == '' or password == '':
return JsonResponse({'status': 0, 'message': 'username or password null'})
user = auth.authenticate(username=username, password=password)
if user is not None:
return JsonResponse({'status': 1, 'message': 'login success'})
else:
return JsonResponse({'status': 0, 'message': 'username or password error'})
else:
return JsonResponse({'status': 0, 'message': 'request type error'})
# 添加文章接口
def add_article(request):
if request.method == 'POST':
id = request.POST.get('id', '')
title = request.POST.get('title', '')
author = request.POST.get('author', '')
content = request.POST.get('content', '')
if id == '' or title == '' or author == '' or content == '':
return JsonResponse({'status': 0, 'message': 'id or title or author or content null'})
if len(title) > 10:
return JsonResponse({'status': 0, 'message': '文章标题过长'})
if len(author) > 10:
return JsonResponse({'status': 0, 'message': '作者名称过长'})
if len(content) > 500:
return JsonResponse({'status': 0, 'message': '文章内容过长'})
try:
result = Article.objects.filter(id=id)
except ValueError:
return JsonResponse({'status': 0, 'message': "参数类型错误"})
if result:
return JsonResponse({'status': 0, 'message': 'article id already exists'})
else:
try:
Article.objects.create(id=id, title=title, author=author, content=content)
except BaseException as e:
return JsonResponse({'status': 0, 'message': e})
finally:
data = {
"id": id,
"title": title,
"author": author,
"content": content
}
return JsonResponse({'status': 1, 'data': data, 'message': 'add article success'})
else:
return JsonResponse({'status': 0, 'message': 'request type error'})
# 修改文章接口
def modify_article(request):
if request.method == 'POST':
id = request.POST.get('id', '')
title = request.POST.get('title', '')
author = request.POST.get('author', '')
content = request.POST.get('content', '')
if id == '' or title == '' or author == '' or content == '':
return JsonResponse({'status': 0, 'message': 'id or title or author or content null'})
try:
result = Article.objects.filter(id=id)
except ValueError:
return JsonResponse({'status': 0, 'message': "参数类型错误"})
if not result:
return JsonResponse({'status': 0, 'message': 'article not exist'})
if len(title) > 10:
return JsonResponse({'status': 0, 'message': '文章标题过长'})
if len(author) > 10:
return JsonResponse({'status': 0, 'message': '作者名称过长'})
if len(content) > 500:
return JsonResponse({'status': 0, 'message': '文章内容过长'})
try:
Article.objects.filter(id=id).update(id=id, title=title, author=author, content=content)
except BaseException as e:
return JsonResponse({'status': 0, 'message': e})
finally:
data = {
"id": id,
"title": title,
"author": author,
"content": content
}
return JsonResponse({'status': 1, 'data': data, 'message': 'modify article success'})
else:
return JsonResponse({'status': 0, 'message': 'request type error'})
# 删除文章接口
def delete_article(request):
if request.method == 'POST':
id = request.POST.get('id', '')
if id == '':
return JsonResponse({'status': 0, 'message': 'id null'})
try:
result = Article.objects.filter(id=id)
except ValueError:
return JsonResponse({'status': 0, 'message': "参数类型错误"})
if not result:
return JsonResponse({'status': 0, 'message': 'id not exist'})
try:
Article.objects.filter(id=id).delete()
except BaseException:
return JsonResponse({'status': 0, 'message': '删除文章失败'})
finally:
return JsonResponse({'status': 1, 'message': 'delete article success'})
else:
return JsonResponse({'status': 0, 'message': 'request type error'})
# 查询文章接口
def get_article(request):
if request.method == 'POST':
title = request.POST.get("title", "")
if title == '':
data = []
articles = Article.objects.all()
if articles:
for article in articles:
r = {
"id": article.id,
"title": article.title,
"author": article.author,
"content": article.content
}
data.append(r)
return JsonResponse({'status': 1, 'message': 'success', 'data': data})
if title != '':
data = []
articles = Article.objects.filter(title__contains=title)
if articles:
for article in articles:
r = {
"id": article.id,
"title": article.title,
"author": article.author,
"content": article.content
}
data.append(r)
return JsonResponse({'status': 1, 'message': 'success', 'data': data})
else:
return JsonResponse({'status': 0, 'message': 'query result is empty'})
else:
return JsonResponse({'status': 0, 'message': 'request type error'})
10.配置URL 打开blog/urls.py输入如下代码
from django.contrib import admin
from django.urls import path
from article import views
urlpatterns = [
path('admin/', admin.site.urls),
path('add_article', views.add_article),
path('modify_article', views.modify_article),
path('delete_article', views.delete_article),
path('get_article', views.get_article),
path('login', views.login),
]
11.启动blog 在manage.py同级目录,输入python manage.py runserver
F:\新建文件夹\blog>python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
March 04, 2019 - 13:25:31
Django version 2.1.4, using settings 'blog.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
21. Blog接口开发的更多相关文章
- windows下shopex农行支付接口开发笔记
1.首先是配置Java和tomcat 农行文档里的是linux下的说明.window下我们要按照以下在setclasspath.bat里设置JAVA_HOME,JRE_HOME(红色字体部分).设置这 ...
- 支付宝WAP支付接口开发
支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...
- 详解EBS接口开发之采购申请导入
更多内容可以参考我的博客 详解EBS接口开发之采购订单导入 http://blog.csdn.net/cai_xingyun/article/details/17114697 /*+++++++ ...
- 详解EBS接口开发之库存事务处理批次更新
库存事务处理批次有时候出现导入错误需要更新可使用次程序更新,批次导入可参考博客 详解EBS接口开发之库存事务处理-物料批次导入 http://blog.csdn.net/cai_xingyun/art ...
- 浅谈rest風格的接口开发
简单描述:因为前后端分离,开发完模块之后,接到team leader的指令,我这个渣渣javaer需要给前端人员返回一个接口,具体内容是课程列表json和分类列表json.emmmm,第一次写接口,心 ...
- 基于Axis1.4的webservice接口开发(代码开发)
基于Axis1.4的webservice接口开发(代码开发) 一.开发环境: 我的开发环境是MyEclipse 2015+Apache-Tomcat-8.0.21. 二.代码开发: 1.新建一个Web ...
- 基于Axis1.4的webservice接口开发(环境搭建)
基于Axis1.4的webservice接口开发(环境搭建) 一.环境搭建: 1.搜索关键字“Axis1.4”下载Axis1.4相关的jar包. 下载地址:http://download.csdn.n ...
- 浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),那么我们来探讨 ...
- 示例浅谈PHP与手机APP开发,即API接口开发
示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...
随机推荐
- Flink水印机制(watermark)
Flink流处理时间方式 EventTime 时间发生的时间,例如:点击网站上的某个链接的时间 IngestionTime 某个Flink节点的source operator接收到数据的时间,例如:某 ...
- 解决“/bin/bash^M: bad interpreter: No such file or directory”
在执行shell脚本时提示这样的错误主要是由于shell脚本文件是dos格式,即每一行结尾以\r\n来标识,而unix格式的文件行尾则以\n来标识. 查看脚本文件是dos格式还是unix格式的几种办 ...
- PAT_A1074#Reversing Linked List
Source: PAT A1074 Reversing Linked List (25 分) Description: Given a constant K and a singly linked l ...
- [CF895E] Eyes Closed(线段树,期望)
Desctiption 传送门:Portal 大致题意: 给你一个序列, 支持两种操作: 1 l1 r1 l2 y2 在\([l1, r1]\)随机选择一个数a, \([l2, r2]\) 内随机选择 ...
- 浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象
最近在着手重构一个java UI桌面项目,发现这个项目在一开始的时候由于需求不明确,以及开发人员对swing框架不熟悉等问题造成了页面代码混乱的情况:为了能够在各个类里都可以拿到其他类的引用去进行相应 ...
- 一次spring boot web服务响应缓慢的排查
使用spring boot搭建了一个web服务,部署在docker容器中.使用中出现了一个性能问题:多次接口请求中,偶尔会出现一次响应非常慢的情况.正常情况下接口的响应时间在10-20ms,偶尔会出现 ...
- 配置静态IP时候route没有设置的GATEWAY问题
今天在想把虚拟机里RHEL6.5设置成静态IP来着 在 /etc/sysconfig/betwork-scripts/ifcfg-eth0 文件中将"GATEWAY"拼写成了&qu ...
- React-Native初识-安卓篇(一)
前言:React-Native简称RN,可以用来构建Android和IOS的应用程序,在接下来的两个半月里,我会记录下本人在学习RN开发项目中的点滴. 本篇目录: 1.React-Native初识 2 ...
- 简单递归____Fibonacci数列
#include <stdio.h> int fun(int x) { ||x==) ; else return fun(x-1)+fun(x-2); } int main() { int ...
- java 比较运算
/* 比较运算符: 大于 > 小于 < 大于等于 >= 小于等于 <= 等于 == 不相等 != 注意事项: 1.比较运算符的结果一定是一个boolean值,成立就是true, ...