Django Web应用开发实战:从日志查看器到数据库管理系统
1. 引言
在当今数字化时代,Web应用无处不在,它们为人们的日常生活和工作提供了极大的便利。作为开发者,了解如何构建Web应用是一项重要的技能。而Python作为一种广泛使用的编程语言,拥有众多优秀的Web应用框架,其中Django以其强大的功能和简洁的开发方式备受青睐。本文将详细介绍Django的相关知识,并通过两个具体的示例——Apache日志查看器和简单数据库应用,带您深入了解如何使用Django构建Web应用。
2. Web应用的优势
Web应用之所以如此受欢迎,主要得益于以下几个显著优势:
-
普遍可访问性
:一旦Web应用部署完成,任何有访问权限的用户只需在浏览器中输入相应的URL即可使用,无需额外下载和安装(除浏览器外,除非使用如Flash等浏览器插件),这为用户提供了极大的便利。
-
单边升级性
:应用所有者可以单方面对整个用户群体进行升级,用户无需进行任何操作。不过,这需要确保升级不依赖于用户当前环境中可能不存在的功能。
-
通用部署平台
:浏览器几乎是通用的部署平台,尽管存在一些跨浏览器兼容性问题,但在不使用特殊插件的情况下,一个在某一操作系统的浏览器中运行的Web应用,大多也能在其他操作系统的浏览器中正常运行。
对于系统管理员来说,Web应用还具有特殊的优势,它可以访问运行它的机器的文件系统和进程表,这使得Web应用成为系统、应用和用户监控及报告机制的理想解决方案。
3. Python Web应用框架选择
Python拥有众多的Web应用框架,这既是优势也是挑战。目前,TurboGears、Django、Pylons和Zope是比较主流的选择。在这些框架中,Django因其全面的功能和与本文主题的契合度,成为本文推荐的框架。
4. Django框架概述
Django是一个全栈Web应用框架,它包含模板系统、通过对象关系映射实现的数据库连接,以及用于编写应用逻辑的Python代码。Django采用了Model-View-Template(MVT)方法,类似于常见的Model-View-Controller(MVC)方法,这种方法有助于将应用的各个部分分离,提高代码的可维护性和可扩展性。
4.1 MVT与MVC对比
| 方法 | 数据库代码 | 业务逻辑 | 表示层 |
|---|---|---|---|
| MVT | 模型(Model) | 视图(View) | 模板(Template) |
| MVC | 模型(Model) | 控制器(Controller) | 视图(View) |
5. Apache日志查看器应用
5.1 项目和应用设置
首先,我们需要下载并安装Django。可以从http://www.djangoproject.com/ 下载代码,推荐安装开发版本。安装完成后,使用以下命令创建项目和应用:
# 创建项目
django-admin.py startproject dj_apache
# 进入项目目录
cd dj_apache
# 创建应用
django-admin.py startapp logview
创建完成后,项目和应用的目录结构如下:
dj_apache/
|-- __init__.py
|-- logview
| |-- __init__.py
| |-- models.py
| `-- views.py
|-- manage.py
|-- settings.py
`-- urls.py
5.2 URL配置
接下来,我们需要配置URL映射,将不同的URL请求映射到相应的视图函数。在
urls.py
文件中添加以下代码:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^$', 'dj_apache.logview.views.list_files'),
(r'^viewlog/(?P<sortmethod>.*?)/(?P<filename>.*?)/$',
'dj_apache.logview.views.view_log'),
)
5.3 视图函数实现
在
views.py
文件中实现视图函数,包括列出文件和查看日志的功能:
# Create your views here.
from django.shortcuts import render_to_response
import os
from apache_log_parser_regex import dictify_logline
import operator
log_dir = '/var/log/apache2'
def get_log_dict(logline):
l = dictify_logline(logline)
try:
l['bytes_sent'] = int(l['bytes_sent'])
except ValueError:
bytes_sent = 0
l['logline'] = logline
return l
def list_files(request):
file_list = [f for f in os.listdir(log_dir) if
os.path.isfile(os.path.join(log_dir, f))]
return render_to_response('list_files.html', {'file_list': file_list})
def view_log(request, sortmethod, filename):
logfile = open(os.path.join(log_dir, filename), 'r')
loglines = [get_log_dict(l) for l in logfile]
logfile.close()
try:
loglines.sort(key=operator.itemgetter(sortmethod))
except KeyError:
pass
return render_to_response('view_logfile.html', {'loglines': loglines,
'filename': filename})
5.4 模板创建
创建模板文件,用于显示文件列表和日志内容。
-
base.html
:基础模板,设置页面的基本结构和默认内容。
<html>
<head>
<title>{% block title %}Apache Logviewer - File Listing{% endblock %}</title>
</head>
<body>
<div><a href="/">Log Directory</a></div>
{% block content %}Empty Content Block{% endblock %}
</body>
</html>
- list_files.html :列出指定目录下的文件。
{% extends "base.html" %}
{% block title %}Apache Logviewer - File Listing{% endblock %}
{% block content %}
<ul>
{% for f in file_list %}
<li><a href="/viewlog/linesort/{{ f }}/" >{{ f }}</a></li>
{% endfor %}
</ul>
{% endblock %}
- view_logfile.html :显示指定日志文件的详细内容,并支持按不同列排序。
{% extends "base.html" %}
{% block title %}Apache Logviewer - File Viewer{% endblock %}
{% block content %}
<table border="1">
<tr>
<td><a href="/viewlog/status/{{ filename }}/">Status</a></td>
<td><a href="/viewlog/remote_host/{{ filename }}/">Remote Host</a></td>
<td><a href="/viewlog/bytes_sent/{{ filename }}/">Bytes Sent</a></td>
<td><a href="/viewlog/linesort/{{ filename }}/">Line</a></td>
</tr>
{% for l in loglines %}
<tr>
<td>{{ l.status }}</td>
<td>{{ l.remote_host }}</td>
<td>{{ l.bytes_sent }}</td>
<td><pre>{{ l.logline }}</pre></td>
</tr>
{% endfor %}
</table>
{% endblock %}
5.5 应用流程
graph LR
A[用户访问网站] --> B{URL匹配}
B -- "/" --> C[调用list_files函数]
C --> D[列出文件列表]
D --> E[渲染list_files.html模板]
B -- "/viewlog/.../" --> F[调用view_log函数]
F --> G[打开日志文件]
G --> H[解析日志行]
H --> I[按指定方法排序]
I --> J[渲染view_logfile.html模板]
这个简单的Web应用通过Django实现了Apache日志文件的查看和排序功能。不过,该应用还有很多可以改进的地方,如支持反向排序、根据特定条件过滤日志行等,这些都可以作为进一步的练习。
6. 简单数据库应用
6.1 项目和应用创建
我们将创建一个计算机系统的库存管理应用,同样使用Django来实现。首先,按照以下步骤创建项目和应用:
# 创建项目
django-admin startproject sysmanage
# 进入项目目录
cd sysmanage
# 创建应用
django-admin startapp inventory
创建完成后,目录结构如下:
sysmanage/
|-- __init__.py
|-- inventory
| |-- __init__.py
| |-- models.py
| `-- views.py
|-- manage.py
|-- settings.py
`-- urls.py
6.2 数据库配置
对于测试或开发阶段,SQLite是一个不错的选择。我们需要在
settings.py
文件中进行如下配置:
import os
# 数据库引擎
DATABASE_ENGINE = 'sqlite3'
# 数据库文件路径
DATABASE_NAME = os.path.join(os.path.dirname(__file__), 'dev.db')
同时,在
settings.py
中添加需要安装的应用:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'sysmanage.inventory',
)
6.3 URL配置
在
urls.py
文件中添加URL映射,包括管理界面和自定义视图的映射:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
# 管理界面
(r'^admin/', include('django.contrib.admin.urls')),
(r'^$', 'sysmanage.inventory.views.main'),
(r'^categorized/(?P<category>.*?)/(?P<category_id>.*?)/$',
'sysmanage.inventory.views.categorized'),
(r'^server_detail/(?P<server_id>.*?)/$',
'sysmanage.inventory.views.server_detail'),
)
6.4 数据库模型定义
在
models.py
文件中定义数据库模型,包括操作系统、服务、硬件组件、服务器和IP地址等:
from django.db import models
# 操作系统模型
class OperatingSystem(models.Model):
name = models.CharField(max_length=50)
description = models.TextField(blank=True, null=True)
def __str__(self):
return self.name
class Admin:
pass
# 服务模型
class Service(models.Model):
name = models.CharField(max_length=50)
description = models.TextField(blank=True, null=True)
def __str__(self):
return self.name
class Admin:
pass
# 硬件组件模型
class HardwareComponent(models.Model):
manufacturer = models.CharField(max_length=50)
# 类型包括显卡、网卡等
type = models.CharField(max_length=50)
model = models.CharField(max_length=50, blank=True, null=True)
vendor_part_number = models.CharField(max_length=50, blank=True, null=True)
description = models.TextField(blank=True, null=True)
def __str__(self):
return self.manufacturer
class Admin:
pass
# 服务器模型
class Server(models.Model):
name = models.CharField(max_length=50)
description = models.TextField(blank=True, null=True)
os = models.ForeignKey(OperatingSystem)
services = models.ManyToManyField(Service)
hardware_component = models.ManyToManyField(HardwareComponent)
def __str__(self):
return self.name
class Admin:
pass
# IP地址模型
class IPAddress(models.Model):
address = models.TextField(blank=True, null=True)
server = models.ForeignKey(Server)
def __str__(self):
return self.address
class Admin:
pass
6.5 数据库创建
在项目目录下运行以下命令创建数据库表:
python manage.py syncdb
运行该命令后,Django会提示创建超级用户,按照提示输入相关信息即可。
6.6 启动开发服务器
运行以下命令启动Django开发服务器:
python manage.py runserver 0.0.0.0:8080
6.7 视图函数实现
在
views.py
文件中实现视图函数:
# Create your views here.
from django.shortcuts import render_to_response
import models
def main(request):
os_list = models.OperatingSystem.objects.all()
svc_list = models.Service.objects.all()
hardware_list = models.HardwareComponent.objects.all()
return render_to_response('main.html', {'os_list': os_list,
'svc_list': svc_list, 'hardware_list': hardware_list})
def categorized(request, category, category_id):
category_dict = {'os': 'Operating System',
'svc': 'Service', 'hw': 'Hardware'}
if category == 'os':
server_list = models.Server.objects.filter(os__exact=category_id)
category_name = models.OperatingSystem.objects.get(id=category_id)
elif category == 'svc':
server_list = \
models.Server.objects.filter(services__exact=category_id)
category_name = models.Service.objects.get(id=category_id)
elif category == 'hw':
server_list = \
models.Server.objects.filter(hardware_component__exact=category_id)
category_name = models.HardwareComponent.objects.get(id=category_id)
else:
server_list = []
return render_to_response('categorized.html', {'server_list': server_list,
'category': category_dict[category], 'category_name': category_name})
def server_detail(request, server_id):
server = models.Server.objects.get(id=server_id)
return render_to_response('server_detail.html', {'server': server})
6.8 模板创建
创建模板文件用于显示不同页面的内容:
-
main.html
:显示操作系统、服务和硬件组件的列表。
{% extends "base.html" %}
{% block title %}Server Inventory Category View{% endblock %}
{% block content %}
<div>
<h2>Operating Systems</h2>
<ul>
{% for o in os_list %}
<li><a href="/categorized/os/{{ o.id }}/" >{{ o.name }}</a></li>
{% endfor %}
</ul>
</div>
<div>
<h2>Services</h2>
<ul>
{% for s in svc_list %}
<li><a href="/categorized/svc/{{ s.id }}/" >{{ s.name }}</a></li>
{% endfor %}
</ul>
</div>
<div>
<h2>Hardware Components</h2>
<ul>
{% for h in hardware_list %}
<li><a href="/categorized/hw/{{ h.id }}/" >{{ h.manufacturer }}</a></li>
{% endfor %}
</ul>
</div>
{% endblock %}
- categorized.html :显示特定类别下的服务器列表。
{% extends "base.html" %}
{% block title %}Server List{% endblock %}
{% block content %}
<h1>{{ category }}::{{ category_name }}</h1>
<div>
<ul>
{% for s in server_list %}
<li><a href="/server_detail/{{ s.id }}/" >{{ s.name }}</a></li>
{% endfor %}
</ul>
</div>
{% endblock %}
- server_detail.html :显示服务器的详细信息。
{% extends "base.html" %}
{% block title %}Server Detail{% endblock %}
{% block content %}
<div>
Name: {{ server.name }}
</div>
<div>
Description: {{ server.description }}
</div>
<div>
OS: {{ server.os.name }}
</div>
<div>
<div>Services:</div>
<ul>
{% for service in server.services.all %}
<li>{{ service.name }}</li>
{% endfor %}
</ul>
</div>
<div>
<div>Hardware:</div>
<ul>
{% for hw in server.hardware_component.all %}
<li>{{ hw.manufacturer }} {{ hw.type }} {{ hw.model }}</li>
{% endfor %}
</ul>
</div>
<div>
<div>IP Addresses:</div>
<ul>
{% for ip in server.ipaddress_set.all %}
<li>{{ ip.address }}</li>
{% endfor %}
</ul>
</div>
{% endblock %}
6.9 应用流程
graph LR
A[用户访问网站] --> B{URL匹配}
B -- "/" --> C[调用main函数]
C --> D[获取操作系统、服务和硬件组件列表]
D --> E[渲染main.html模板]
B -- "/categorized/.../" --> F[调用categorized函数]
F --> G[根据类别查询服务器列表]
G --> H[渲染categorized.html模板]
B -- "/server_detail/.../" --> I[调用server_detail函数]
I --> J[获取服务器详细信息]
J --> K[渲染server_detail.html模板]
7. 总结
通过以上两个示例,我们深入了解了如何使用Django构建Web应用。从简单的Apache日志查看器到具有数据库交互功能的库存管理应用,Django展示了其强大的功能和便捷的开发方式。它不仅提供了丰富的内置功能,如管理界面、对象关系映射等,还支持通过自定义视图和模板来满足不同的业务需求。希望本文能帮助您更好地掌握Django的使用,开启您的Web应用开发之旅。
超级会员免费看
1680

被折叠的 条评论
为什么被折叠?



