版權聲明:本文為博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。
之前博客的雲主機到期了沒續費,被刪啦
最重要的是沒有備份!此處省略幾個字。。。。。
![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX183NDczWkgwMFNJR0cuZ2lm.png)
從這篇文章開始我的博客便開啟了新的分類:NetDevops,希望在這里記錄並分享我與網絡及網絡安全自動化運維平台的故事。原則是:有時間多擼代碼,定期通過博客總結![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX182NzI0RU4wMFNJR0cuZ2lm.png)
![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX183NDE1WkgwMFNJR0cuZ2lm.png)
![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX183NDE1WkgwMFNJR0cuZ2lm.png)
![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX183NDE1WkgwMFNJR0cuZ2lm.png)
![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX182NzI0RU4wMFNJR0cuZ2lm.png)
![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX183NDE1WkgwMFNJR0cuZ2lm.png)
![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX183NDE1WkgwMFNJR0cuZ2lm.png)
![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX183NDE1WkgwMFNJR0cuZ2lm.png)
![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX182ODM4RU4wMFNJR0cuZ2lm.png)
本文主要記錄通過Python實現獲取用戶基本信息(IP地址、客戶端angent等信息),搞這個功能我是這樣想的:運維平台的使用者主要有管理員、運維人員、普通用戶,每當有用戶登錄或訪問平台時我們記錄該用戶的基本信息並保存至數據庫。或許將來我們針對自己的平台做審計功能時會用到這些數據。
言歸正傳,本次開發環境為:Python 3.7.4 、Django 2.2.4、Mysql 8.0.15、Docker 18.09.2 ;編譯工具使用Pycharm;操作環境為Debian 4.19.0-kali5-amd64、VMware® Workstation 15 Pro
一、我們創建名為NetDevOps的Django工程
可以通過Pycharm創建也可以在終端通過命令創建,習慣CLI界面的我當然使用命令創建了
命令如下:
![[NetDevops]網絡自動化運維--1獲取用戶基本信息 [NetDevops]網絡自動化運維--1獲取用戶基本信息](/image/aHR0cDovL3d3dy5zaW5haW1nLmNuL3VjL215c2hvdy9ibG9nL21pc2MvZ2lmL0VfX182NzI0RU4wMFNJR0cuZ2lm.png)
a.django-admin startproject NetDevops #創建工程
b.python manage.py startapp Users #創建APP(需切換到工程目錄下)
二、修改settings文件(連接數據庫)
a.找見settings文件中有關DATABASES的配置,並將默認的連接方式sqllite3替換為mysql

1 DATABASES = { 2 'default': { 3 'ENGINE': 'django.db.backends.mysql', 4 'NAME': 'netdevops', 5 'USER': 'forgeek', 6 'PASSWORD': 'xxxxxx', 7 'HOST': '172.16.127.128', 8 'PORT': '3306', 9 'OPTIONS': {}, 10 'init_command': 'SET storage_engine=INNODB,' 11 'SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED, autocommit=1, names "utf8";', 12 } 13 }
b.修改init文件
Python3中無法通過pip直接安裝mysqlclient,所以我們使用pymysql來代替它。通過pip安裝好pymysql后我們要修改MySQLdb()的引擎,我們僅需要修改工程目錄下init.py文件即可,添加如下代碼:
import pymysql
pymysql.install_as_MySQLdb()
三、簡單介紹一下本功能模型原理
用戶通過瀏覽器輸入地址訪問平台--->urls路由轉發--->接口獲取信息--->view視圖--->數據庫--->view視圖通過Httpresponse給瀏覽器
四、開始擼代碼:
- Mysql配置
# 創建mysql帳號(這里的帳號信息要與settings配置文件中連接數據庫的配置信息保持一致)
mysql> alter user 'forgeek'@'%' identified with mysql_native_password by 'xxxx';
# 設置forgeek帳號密碼永不過期
mysql> alter user 'forgeek'@'%' identified by 'xxxx' password expire never;# 授權(這里由於測試環境我這邊分配權限比較大,大家可以根據自己情況設置)
grant all privileges on *.* to 'forgeek'@'%';
# 刷新權限
mysql> flush privileges;
# 驗證用戶的創建是否成功
mysql> select host,user,authentication_string from mysql.user;# 創建名為netdevops的數據庫mysql> create database netdevops;
- models模型類
在我們創建的Users這個app中有個models.py文件,在Django中model是你數據的單一、明確的信息來源。它包含了你存儲的數據的重要字段和行為。通常,一個模型(model)映射到一個數據庫表。
定義簡介:
- 每個模型都是一個python類,它是django.db.models.Model的子類
- 模型的每個屬性都代表一個數據庫字段
- 綜上所述,Django為您提供了一個自動生成的數據庫訪問API,詳細見官方文檔。
model與數據庫結構對應關系圖如下:
這個小功能中我們需要建立兩張表,一個保存用戶信息另一個保存瀏覽器信息。考慮到一個用戶可能會有多個瀏覽器,因此需要建立一個一對多的關系。我這里直接貼源碼好了,有不懂的直接留言好了。

1 # coding=utf-8 2 from django.db import models 3 4 5 class UserIpInfo(models.Model): 6 ip = models.CharField(max_length=40, default='', verbose_name=u'IP地址', null=True) 7 time = models.DateTimeField(verbose_name=u'更新時間', auto_now=True) 8 9 class Meta: 10 verbose_name = u"用戶訪問IP地址表" 11 verbose_name_plural = verbose_name 12 db_table = "useripinfo" 13 14 15 class BrowseInfo(models.Model): 16 useragent = models.CharField(max_length=200, default='', verbose_name=u'用戶瀏覽器信息', null=True) 17 models.CharField(max_length=256, verbose_name=u'設備唯一ID', default='') 18 user_ip = models.ForeignKey("UserIpInfo", on_delete=models.CASCADE) 19 20 class Meta: 21 verbose_name = u"用戶瀏覽器信息表" 22 verbose_name_plural = verbose_name 23 db_table = "browseinfo"
- views視圖
Django 的視圖層,主要是負責處理用戶的請求並返回響應。視圖函數只是一個Python函數,它接受Web請求並返回Web響應。此響應可以是網頁的HTML內容,重定向,404錯誤,XML文檔或圖像或者其他什么。視圖本身包含返回該響應所需的任意邏輯。只要在Python路徑上,此代碼就可以存在於您想要的任何地方。沒有其他要求 - 沒有“魔術”,可以這么說。為了將代碼放在某處,慣例是將視圖放在名為views.py的文件中,放在項目或應用程序目錄中。
這里同樣,我將整個源碼貼出來。有問題就留言吧

1 # from django.shortcuts import render 2 from django.http import HttpResponse 3 from .models import * 4 import json 5 6 7 def user_ip_info(request): 8 # print('-----------------test/n', request.META) 9 ip_addr = request.META['REMOTE_ADDR'] 10 user_ua = request.META['HTTP_USER_AGENT'] 11 print(len(user_ua)) 12 13 user_obj = UserIpInfo.objects.filter(ip=ip_addr) 14 if not user_obj: 15 res = UserIpInfo.objects.create(ip=ip_addr) 16 ip_addr_id = res.id 17 else: 18 ip_addr_id = user_obj[0].id 19 20 BrowseInfo.objects.create(useragent=user_ua, user_ip=UserIpInfo.objects.get(id=ip_addr_id)) 21 22 result = { 23 "狀態": "Success!", 24 "信息": "User info", 25 "IP": ip_addr, 26 "瀏覽器": user_ua 27 } 28 29 return HttpResponse(json.dumps(result), content_type="application/json", charset="utf-8") 30 31 32 def user_infos(request): 33 ip_list = UserIpInfo.objects.all() 34 infos = {} 35 for item in ip_list: 36 infos[item.ip] = [b_obj.useragent for b_obj in BrowseInfo.objects.filter(user_ip_id=item.id)] 37 38 result = {"狀態": "Success!", "信息": infos} 39 40 return HttpResponse(json.dumps(result), content_type="application/json", charset="utf-8")
- urls路由轉發
對於高質量的Web 應用來說,使用簡潔、優雅的URL 模式是一個非常值得重視的細節。Django 允許你自由地設計你的URL,不受框架束縛。
為了給一個應用設計URL,你需要創建一個Python 模塊,通常被稱為**URLconf**(URL configuration)。這個模塊是純粹的Python 代碼,包含URL 模式(簡單的正則表達式)到Python 函數(你的視圖)的簡單映射。映射可短可長,隨便你。它可以引用其它的映射。而且,因為它是純粹的Python 代碼,它可以動態構造。
Django 還提供根據當前語言翻譯URL 的一種方法。更多信息參見 國際化文檔。
----------------該段落引用官方文檔-------------------
(https://docs.djangoproject.com/zh-hans/2.2/topics/http/urls/)
我這里還是同樣直接貼出源碼,有問題留言即可。
1、
NetDevops項目中urls.py

1 from django.urls import path 2 from . import views 3 4 urlpatterns = [ 5 path('send/', views.user_ip_info), 6 path('get/', views.user_infos), 7 8 ]
2、User 應用中urls.py:

1 from django.urls import path 2 from . import views 3 4 urlpatterns = [ 5 path('send/', views.user_ip_info), 6 path('get/', views.user_infos), 7 8 ]
由於我這里是通過JSON格式反饋到瀏覽器,所以沒有些特殊的HTML文件,等后期其他功能再來完善本次項目的模板。
下面是這個功能的目錄結構:

打開終端我們通過命令:
1、生成遷移文件: python3 manage.py makemigrations
2、進行遷移:python3 manage.py migrate
3、打開Djang自帶調試web服務端:python3 manage.py runserver 0.0.0.0:80
最后就是打開瀏覽器測試了,前提是要確保你的和整個工程是連接好的。