Django入门引导
Django工程结构
Django分为容器项目和应用项目
一个容器项目下可以存在多个应用项目
容器项目并没有实际作用,可以修改容器项目名称,并不影响工程的运行
建立容器项目和应用项目
创建容器项目
#安装Django
pip3 install django==2.2.2
#创建容器项目
django-admin startproject devops
devops 是应用项目
init.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件
setting.py django框架的核心配置文件
urls.py django路由设置文件
manage.py 是命令管理工具,管理django容器及项目工程启动、关闭、数据迁移等
使用python3启动django,需要修改manage.py文件
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
#新添加内容
import pymysql
pymysql.install_as_MySQLdb()
#新添加内容
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'devops.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
创建应用
修改devops/settings.py文件
#注释内容
# Database
# https://docs.djangoproject.com/en/2.2/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',
'NAME': 'mydevops',
'USER': 'admin',
'PASSWORD': 'admin',
'HOST': '127.0.0.1',
'PORT': '',
'OPTIONS': {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'", #设置严格模式
},
'init_command': 'SET storage_engine=INNODB,'
'SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED, autocommit=1, names "utf8";',
}
}
#新增内容
创建应用项目
python3 ./manage.py startapp scanhosts
models.py 模型文件,用于操作数据库
views.py 视图文件,可以理解为控制器,用于做逻辑处理
migrations 目录,保存临时数据文件,用于文件迁移
modles模型建立
settings文件配置
查看基础路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print("...........................{}".format(BASE_DIR))
添加scanhosts应用到配置文件
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'scanhosts', #新加应用配置文件
]
model模型建模
参考链接
编辑models.py文件
#coding=utf-8
from django.db import models
# Create your models here.
class UserIPInfo(models.Model):
ip = models.CharField(max_length=40, default='',verbose_name=u'ip地址',null=True)
time = models.DateTimeField(verbose_name=u'更新时间', auto_now=True)
class Meta:
verbose_name =u'用户访问地址信息表'
verbose_name_plural = verbose_name
db_table = 'useripinfo'
class BrowseInfo(models.Model):
useragent = models.CharField(max_length=255,default='',verbose_name=u'用户浏览器agent信息',null=True)
models.CharField(max_length=256,verbose_name=u'唯一设备ID',default=u'')
userip = models.ForeignKey(to='UserIPInfo',related_name='userip',on_delete=models.CASCADE)
class Meta:
verbose_name =u'用户浏览器信息表'
verbose_name_plural = verbose_name
db_table = 'browseinfo'
创建数据库
mysql -uroot -proot -e "create database mydevops;"
#允许使用127.0.0.1登录
mysql -uroot -proot -e "grant all on mydevops.* to admin@'127.0.0.1' identified by 'admin';"
#允许任意外部连接
mysql -uroot -proot -e "grant all on mydevops.* to admin@'%' identified by 'admin';"
mysql -h127.0.0.1 -uadmin -padmin -e "show databases;"
字段类型:
CharField:字符串字段
IntegerField:整数型字段
DateTimeField:时间日期字段
ForeignKey:定义多对一关系
迁移
迁移命令
python3 ./manage.py makemigrations
python3 ./manage.py migrate
登录数据库查询
MariaDB [mydevops]> show create table browseinfoG;
*************************** 1. row ***************************
Table: browseinfo
Create Table: CREATE TABLE `browseinfo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`useragent` varchar(255) DEFAULT NULL,
`userip_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `browseinfo_userip_id_f280e3ca_fk_useripinfo_id` (`userip_id`),
CONSTRAINT `browseinfo_userip_id_f280e3ca_fk_useripinfo_id` FOREIGN KEY (`userip_id`) REFERENCES `useripinfo` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR: No query specified
MariaDB [mydevops]> show create table useripinfoG;
*************************** 1. row ***************************
Table: useripinfo
Create Table: CREATE TABLE `useripinfo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip` varchar(40) DEFAULT NULL,
`time` datetime(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
项目设计
项目开发
采集接口
No. | url | 视图 |
---|---|---|
1 | http://127.0.0.01/sendinfos | userinfo |
提示:在settings文件中,允许所有主机访问服务需要开启
ALLOWED_HOSTS = ['*']
devops/urls.py
from django.contrib import admin
from django.urls import path
from scanhosts.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('sendinfos/',user_info),
]
scanfhosts/views.py
from django.shortcuts import render
from django.http import JsonResponse, HttpResponse
from scanhosts.models import *
import json
# Create your views here.
def user_info(request):
ip_addr = request.META['REMOTE_ADDR']
user_ua = request.META['HTTP_USER_AGENT']
user_obj = UserIPInfo.objects.filter(ip = ip_addr)
if not user_obj:
res = UserIPInfo.objects.create(ip = ip_addr)
ip_add_id = res.id
else:
ip_add_id = user_obj[0].id
BrowseInfo.objects.create(useragent = user_ua,userip_id = ip_add_id )
result = {
"STATUS":"success",
"INFO":"User info",
"IP":ip_addr,
"UA":user_ua
}
return HttpResponse(json.dumps(result), content_type = "application/json")