周一开始学了django,那么今天作为一个小的阶段性总结来复盘一下自己这几天所学的东西,并且Figure out一下:
首先是如何创建一个django项目?
OK,首先需要了解一下我们在创建完Django项目之后的这些东西分别是什么
__init__这个文件是很关键的,是将项目封装成包,并且能被引用的重要文件,千万不能删掉了,见过很多出问题的都是因为不注意这个删掉了导致的Error
要开始的话我们先看下这个settings,
# Application definition
INSTALLED_APPS = [#安装的应用
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
这里面放置的主要是已经安装的app应用,你自己写的也是归类其中的,如果你有相应的已经startapp的一定要记得写到里面不然是不会运行的。
#中间件过滤请求
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',#内置安全机制,保护用户与网站的通信安全
'django.contrib.sessions.middleware.SessionMiddleware',#绘画session功能呢g
'django.middleware.common.CommonMiddleware',#处理请求信息
'django.middleware.csrf.CsrfViewMiddleware',#csrf安全防护
'django.contrib.auth.middleware.AuthenticationMiddleware',#开启内置用户认证
'django.contrib.messages.middleware.MessageMiddleware',#开启内置信息提示
'django.middleware.clickjacking.XFrameOptionsMiddleware',#防止恶意程序点击劫持
]
还有一些是已经被系统默认装载的中间件;
"""
from django.contrib import admin
from django.urls import path,include
from api.views import my_api
urlpatterns = [#父url
path('admin/', admin.site.urls),
path('api/',include('api.urls')),#最大端口号65535
path('api_user/',include('api_user.urls'))
]
再有就是urls.py中路由的书写,计算机网络告诉我们路由的功能就是类似一张表可以对信息进行定向Orz
可以这么说,当写好这个就相当于是开了一个好头,但是这个开始不是一成不变的,随着你构建的框架和步骤越来越完整,你的这个父路由也要相应的改变
娜美接下来为了保持数据关联,尤其是数据库的关联,我们需要进行迁移(Migration)
这时候运用到指令是
Microsoft Windows [版本 10.0.18362.959]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\16099\Desktop\untitled>python manage.py makemigrations
C:\Users\16099\Desktop\untitled>python mangae.py migrate
结束玩这一步之后我们进行一个小的总结
迁移成功之后会出来这样的一个项目在文件管理器中
创建新项目该怎么写呢?
python manage.py startapp api
新建的app是api,为了让这个能有效的使用,我们在前面的settings中要加入这个app,即
INSTALLED_APPS = [#安装的应用
'api',
]
完成这步之后,我们对视图——views.py进行编写:
from django.shortcuts import render
from django.http import JsonResponse
#当django的服务器收到用户的请求后,会通过JsonResponse返回值
from api.models import GameInfo
#这里连接的是我们的数据库
from django.forms.models import model_to_dict
#这里django自带的功能可以将数据库转化为字典形式,便于数据传输
# Create your views here.
def my_api(request):#请求返回体
dict1={#假设从数据库查询的数据
'name':'nigix',
'version':'1.15 '
}
return JsonResponse({'data':dict1})#将查询结果返回给前端
def tieba(request):
kw=request.GET.get('kw')#在url打出自己要的字段可以返回值
return JsonResponse({'data':kw})
#查询数据
def query_user(request):
results = GameInfo.objects.filter(date1__range=('2020-07-08','2020-07-15')) #日期范围,在后面我们会多次用到filter类似于过滤器
print(results) #QuerySet 查询结果集是个列表 列表中是可迭代对象
#方式1 手动序列化
list_user = []
for rs in results:
list_user.append(model_to_dict(rs,fields=['id','username','password','money']))
#这里我们其实目标很明确,就是把我们数据库中的数据转换成自定形式输出
#exclude>fields的优先级
# collections = {}
# collections['id'] = rs.id
# collections['usrename'] = rs.username
# collections['password'] = rs.password
# collections['money'] = rs.money
# list_user.append(collections)
return JsonResponse({'data': list_user})
def add_user(request):
#方式一
# game=GameInfo.objects.create(username='lisi',password='123456',money=10000.0)
# game.save() #提交数据库保存
#方式2
GameInfo(username='zhangsan',password='123456',money=10000.0).save()
#最后这个.save()表示提交数据库保存
return JsonResponse({'data': '数据添加成功!'})
def update_user(request):
GameInfo.objects.filter(username='zhangsan').update(money=20000.0)
return JsonResponse({'data': '数据更新成功!'})
def delete_user(request):
GameInfo.objects.filter(username='zhangsan').delete()
return JsonResponse({'data': '数据删除成功'})
def query_and_update(request):
username = request.GET.get('username')
#这里是在网站索引栏通过/?username=XXXX的子url形式进行查找,从而得到相应的答复
query_user = GameInfo.objects.filter(username__istartswith=username)
if query_user:
money=GameInfo.objects.filter(username__istartswith=username)[0].money
GameInfo.objects.filter(username__istartswith=username).update(money=money+10000.0)
#这里表示如果数据存在就进行更新,否则将数据插入数据库
return JsonResponse({'data': '数据zs更新成功'})
else:
GameInfo(username='zhangsan', password='123456', money=10000.0).save()
return JsonResponse({'data': '数据添加成功!'})
'''
字段__gt= (大于多少)
字段__gte= (大于等于多少)
字段__lt= (小于多少)
字段__lte= (小于等于)
字段__range(starttime,endtime)
'''
这里我们可以将urls.py进行编写了:
from django.contrib import admin
from django.urls import path
from api.views import my_api,tieba
from api.views import query_user
from api.views import add_user,update_user,delete_user,query_and_update
urlpatterns = [#子url
path('f/',my_api),#最大端口号65535#子路由
path('get_kw',tieba),
path('query_user/',query_user),
path('add/',add_user),
path('update/',update_user),
path('delete/',delete_user),
path('query_and_update/',query_and_update),
]
把刚才我们def的函数都引进urls中便于使用
另外哦,我们将数据库还要定义一下:
from django.db import models
# Create your models here.
class User(models.Model):
id=models.AutoField(primary_key=True)
#定义主键
username=models.CharField(max_length=20,verbose_name="用户名")
#注意奥这里的verbose_name其实就是我们在django的管理界面显示的名称
password=models.CharField(max_length=20,verbose_name="密码",default='123456')
is_delete=models.BooleanField(default=False)#数据库 0 1??????????????
is_activate=models.BooleanField(default=False)#布尔类型,定义数据库默认状态是未激活状态
class Money(models.Model):
money=models.FloatField(verbose_name="充值金额",default=0)
user=models.ForeignKey(User,on_delete=models.CASCADE)#级联删除
from django.db import models
# Create your models here.
class GameInfo(models.Model):
id=models.AutoField(primary_key=True)#自增主键
username=models.CharField(max_length=20,verbose_name='用户名')#字符串
password=models.CharField(max_length=40,verbose_name='密码')
money=models.FloatField(verbose_name='充值金额')#浮点型
bool = models.BooleanField(default=True) # 布尔型
date1 = models.DateField(auto_now_add=True)
date2 = models.DateTimeField(auto_now_add=True)
email = models.EmailField(default='QQnumber@qq.com') # email 正则表达式
# file = models.FileField(default='无') # 文件上传
# image = models.ImageField(default='无') # 图片上传 1存本地 2.存图床
text = models.TextField(max_length=5000,default='无') # 文本域
class Meta:
verbose_name='用户信息'
verbose_name_plural=verbose_name
这是另一个创建的models型
from django.contrib import admin
from api.models import GameInfo
# Register your models here.
class GameInfoAdmin(admin.ModelAdmin):
list_display = ['id','username','password','money']
list_per_page = 2
list_editable =['money']
search_fields = ['id','username','money']
readonly_fields = ['username']
admin.site.register(GameInfo,GameInfoAdmin)
这里是对于admin界面的设计代码,主要意义其实很简单,第一个是有四个选择项,第二个是分页,分为2页,第三个是可修改的项为money项,第四个是可以被检索到的项为这三个,第四个是不可修改的项为username
from django.shortcuts import render
from django.views import View
from django.http import JsonResponse,QueryDict
from django.views.decorators.csrf import csrf_exempt
from api_user.models import *
from django.contrib.auth.hashers import make_password,check_password
#这里两个分别是对于密码进行加密和检查密码,简化查询操作
from django.core.mail import send_mail
from django.conf import settings
import requests
def activate(request):
user_id = request.GET.get('user_id')
User.objects.filter(id=user_id).update(is_activate=True)
return JsonResponse({'data': 'Activate successful'})
#这里定义的激活操作,主要功能就是将数据库默认的未激活状态激活
# Create your views here.
class UserInfo(View):
@csrf_exempt
#这里主要是屏蔽csrf防护
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)#用于验证用户登录
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
def get(self,request):
username = request.GET.get('username')
password = request.GET.get('password')
if not User.objects.filter(username=username):
return JsonResponse({'data': '该用户不存在!'})
else:
if check_password(password,User.objects.get(username=username).password):
return JsonResponse({'data': '用户登陆成功!'})
else:
return JsonResponse({'data': '用户密码错误!'})
def post(self,request):
username = request.POST.get('username')
password = request.POST.get('password')
if User.objects.filter(username=username):
return JsonResponse({'data':'用户已存在'})
else:
add_user=User(username=username,password=make_password(password))
#对输入的密码加密
add_user.save()
user_id=add_user.id
try:
#给你的目标邮箱发送邮件点击就可以激活
title='Tencent充值注册激活'
message='<a href="http://127.0.0.1:8000/api_user/activate/?user_id={}">点击激活</a>'.format(user_id)#这里的.format就是读取你的输入id并且放入激活链接
send_mail(title,message,settings.EMAIL_FORM,['QQnumber@qq.com'],html_message=message)
except Exception as e:
print(e)
return JsonResponse({'data':'用户创建成功'})
#return JsonResponse({'data':"我是post请求",'username':username,'password':password})
def put(self,request):#充钱接口
user_id = 1
puts = QueryDict(request.body)
#这里利用一个request.body来对输入的
money = float(puts['money'])
try:
has_money = Money.objects.get(user_id=user_id).money
except:
has_money = 0.0
if has_money:
Money.objects.filter(user_id=user_id).update(money=money + has_money)
return JsonResponse({'data': '加钱成功,感谢您对TX的支持'})
else:
Money.objects.create(user_id=user_id, money=money).save()
return JsonResponse({'data': '第一次充钱成功!'})
#username=puts['username']
#password=puts['password']
#return JsonResponse({'data':"我是put请求",'username':username,'password':password})
def delete(self,request):
deletes = QueryDict(request.body)
username = deletes['username']
password = deletes['password']
return JsonResponse({'data': '我是delete请求', 'username': username, 'password': password})
这里是子路由的编写:
from django.urls import path
from api_user.views import *
urlpatterns=[
path('user/',UserInfo.as_view()),
path('activate/',activate)#这里的activate要定义在class外,不然你就要写UserInfo.activate
]
这里是什么呢,这里是你要传输的文本和接口
from django.test import TestCase
import requests
data={
'money':'10000'
}
data_user={
'username':'最强赘婿',
'password':'aaaaaa'
}
#req=requests.put(url='http://127.0.0.1:8000/api_user/user/',data=data)
#print(req.json())
req=requests.post(url='http://127.0.0.1:8000/api_user/user/',data=data_user)
print(req.json())
req=requests.get(url='http://127.0.0.1:8000/api_user/user/',data=data_user)
print(req.json())
其他的也没什么了,试一下:
Tomorrow is another day!!