开始
新建virtualenv环境
新建django容器
python manage.py
新建django应用
python manage.py
修改容器setting.py导入django应用
路由定义
路由定义容器路径下urls.py
,需要先在应用里定义号试图函数,然后才能做转发
from django.contrib import admin
from django.urls import path
from scanhosts.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('sendinfos/', send_infos),
path('getinfos/', get_infos),
]
视图函数
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from scanhosts.models import *
import logging
import json
logger = logging.getLogger('django')
def send_infos(request):
ip_addr = request.META['REMOTE_ADDR']
user_agent = request.META['HTTP_USER_AGENT']
logger.info('start query user ip...')
user_obj = UserIPInfo.objects.filter(ip=ip_addr)
if not user_obj:
res = UserIPInfo.objects.create(ip=ip_addr)
ip_addr_id = res.id
logger.info('not found user ip...')
else:
ip_addr_id = user_obj[0].id
logger.info('found user ip [{}]...'.format(user_obj[0].ip))
BrowserInfo.objects.create(user_agent=user_agent, user_ip_id=ip_addr_id)
result = {
'status': 'success',
'info': 'user info',
'ip': ip_addr,
'ua': user_agent,
}
logging.info('return response...')
return HttpResponse(json.dumps(result), content_type='application/json')
def get_infos(request):
ip_list = UserIPInfo.objects.all()
infos = {}
for item in ip_list:
infos[item.ip] = [bro_his.user_agent for bro_his in BrowserInfo.objects.filter(user_ip_id=item.id)]
return HttpResponse(json.dumps({'status': 'success', 'result': infos}), content_type='application/json')
模型定义
模型定义属于应用级下的models.py,大体语法和flask相似
from django.db import models
class UserIPInfo(models.Model):
ip = models.CharField(max_length=40, default='', verbose_name='IP地址', null=True)
time = models.DateTimeField(verbose_name='更新时间', auto_now=True)
class Meta:
verbose_name = '用户访问地址信息表'
verbose_name_plural = verbose_name
db_table = "user_ip_info"
class BrowserInfo(models.Model):
user_agent = models.CharField(max_length=100, default='', verbose_name='浏览器客户端', null=True)
models.CharField(max_length=256, verbose_name='唯一设备ID', default='')
user_ip = models.ForeignKey('UserIPInfo', on_delete='CASCADE')
class Meta:
verbose_name = '浏览器信息表'
verbose_name_plural = verbose_name
db_table = 'browser_info'
模型迁移
这方面也和flask相似,先生成迁移文件,然后执行迁移,除了语法不同的是,django会默认多创建出很多关于用户权限的表
# 生成迁移文件
python manage.py makemigrations
# 执行迁移
python manage.py migrate
数据库DB配置
init_params = ['SET storage_engine=INNODB',
'SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
'autocommit=1',
'names "utf8";']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'devops',
'USER': 'devops',
'PASSWORD': 'devops',
'HOST': '192.168.1.150',
'PORT': 3003,
'OPTIONS': {},
'init_command': ', '.join(init_params),
}
}