Django基础04

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")

第一个DevOPS工程

Django日志logging模块

Django邮件发送

原文地址:https://www.cnblogs.com/anyux/p/11922057.html