python&&Django框架&&完整示例一
Hi ! 这是一个作业示例
CMD.exe创建Django项目
#首先,切换到你存放项目的目录下。
#其次,执行以下命令,创建一个Django项目。此处我创建的项目名称为LearnDjangoDemoT
D:\backupAll\eclipseRoot>django-admin.py startproject LearnDjangoDemoT
#此时,当前目录出现了一个新的项目文件夹
D:\backupAll\eclipseRoot>dir
D:\backupAll\eclipseRoot 的目录
2019/09/23/周一 23:18 <DIR> .
2019/09/23/周一 23:18 <DIR> ..
2019/09/09/周一 20:35 <DIR> .metadata
2019/09/23/周一 23:18 <DIR> LearnDjangoDemoT
#进入并查看项目根目录都有啥
D:\backupAll\eclipseRoot>cd LearnDjangoDemoT
D:\backupAll\eclipseRoot\LearnDjangoDemoT>dir
D:\backupAll\eclipseRoot\LearnDjangoDemoT 的目录
2019/09/23/周一 23:18 <DIR> .
2019/09/23/周一 23:18 <DIR> ..
2019/09/23/周一 23:18 <DIR> LearnDjangoDemoT
2019/09/23/周一 23:18 657 manage.py
#在项目根目录下创建一个app,此处我创建的app名称为web。一个Django项目总是由许多不同功能的app组成
D:\backupAll\eclipseRoot\LearnDjangoDemoT>python manage.py startapp web
#此时,项目根目录下出现了一个新的app文件夹。
D:\backupAll\eclipseRoot\LearnDjangoDemoT>dir
D:\backupAll\eclipseRoot\LearnDjangoDemoT 的目录
2019/09/23/周一 23:19 <DIR> .
2019/09/23/周一 23:19 <DIR> ..
2019/09/23/周一 23:19 <DIR> LearnDjangoDemoT
2019/09/23/周一 23:18 657 manage.py
2019/09/23/周一 23:19 <DIR> web
1 个文件 657 字节
4 个目录 6,483,136,512 可用字节
Django的配置文件配置
此处以eclipse软件示例Django项目的开发过程
打开eclipse软件导入Django项目
原始Django项目框架图
增加新目录template和static并配置settings.py文件
templates:存放html文件
static:存放静态文件
配置settings.py文件
settings.py
登录功能
在templates目录下的web目录内创建login.html文件作为登录的web页,(若无template目录则手动创建即可)
编辑login.html文件并设置而login.html文件使用UTF-8编码
notepad++设置方法为:“编码”》使用UTF-8编码“”
<!doctype html>
<html>
<head>
<!--对页面编码进行设置-->
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<!--兼容IE6浏览器-->
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title>demo 10</title>
<style>
.hide{
display:none;
}
.clearfix:after{
content:".";
display:block;
height:0;
clear:both;
visibility:hidden;
}
</style>
</head>
<body>
<form action="/web/login/" method="POST">
<div>
<div>
<input name='username' placeholder="用户名" />
</div>
<div>
<input name='password' placeholder="密码" />
</div>
<div>
<input type='submit' value="提交" />
<label style="color:red;">{{status}}</label>
</div>
</div>
</form>
<!--引入jQuery文件-->
<script src="jquery-1.11.0.min.js"></script>
<script type="text/javascript">
</script>
</body>
</html>
在eclipse软件中更改项目的文本编码
eclipse软件设置方法为:鼠标右击项目名称LearnDjangoDemoT》“Properties”》“Resource”》“Text file encoding”》点击“Other”》选择“UTF-8”》”Apply”》“Apply and Close”
配置主路由系统
编辑项目LearnDjangoDemoT下的》LearnDjangoDemoT目录下的》urls.py文件
配置子路由系统
编辑项目LearnDjangoDemoT下的》web目录下的》urls.py文件(urls.py文件默认是不存在的,需要从LearnDjangoDemoT目录下复制一份urls.py文件到web目录下)
在web目录下的models.py文件中创建数据库类
from django.db import models
# Create your models here.
#用户类型:包含普通管理员、超级管理员等
class UserType(models.Model):
name = models.CharField(max_length=50)
#用户信息:包含用户名、密码等
#ForeignKey("UserType"):每一个用户必须具有一个用户类型
class UserInfo(models.Model):
username = models.CharField(max_length=50)
password = models.CharField(max_length=50)
email = models.EmailField()
user_type = models.ForeignKey(to='UserType',on_delete=models.CASCADE )
class UserGroup(models.Model):
GroupName = models.CharField(max_length=50)
user = models.ManyToManyField('UserInfo')
#资产表:
class Asset(models.Model):
hostname = models.CharField(max_length=256)
ip = models.GenericIPAddressField()
user_group = models.ForeignKey(to='UserGroup',on_delete=models.CASCADE )
在settings.py文件中配置数据库连接配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day12',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '',
'PORT': '',
}
}
启动mysql数据库》手动创建数据库day12
D:\backupAll\eclipseRoot\LearnDjangoDemoT>mysql -uroot -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 142
Server version: 8.0.17 MySQL Community Server - GPL
#查看当前数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
8 rows in set (0.00 sec)
#创建新数据库day12
mysql> create database day12 ;
Query OK, 1 row affected (0.01 sec)
#此时,新数据库day12创建成功
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| day12 |
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
9 rows in set (0.00 sec)
在Django项目根目录下执行cmd命令创建web models.py文件中定义的数据库表
D:\backupAll\eclipseRoot\LearnDjangoDemoT>dir
D:\backupAll\eclipseRoot\LearnDjangoDemoT 的目录
2019/09/24/周二 13:11 <DIR> .
2019/09/24/周二 13:11 <DIR> ..
2019/09/23/周一 23:52 387 .project
2019/09/23/周一 23:52 323 .pydevproject
2019/09/24/周二 11:08 <DIR> .settings
2019/09/24/周二 13:11 0 db.sqlite3
2019/09/23/周一 23:19 <DIR> LearnDjangoDemoT
2019/09/23/周一 23:18 657 manage.py
2019/09/23/周一 23:47 <DIR> static
2019/09/24/周二 13:17 <DIR> templates
2019/09/24/周二 14:59 <DIR> web
4 个文件 1,367 字节
7 个目录 6,482,362,368 可用字节
##
D:\backupAll\eclipseRoot\LearnDjangoDemoT>python manage.py makemigrations
Migrations for 'web':
web\migrations\0001_initial.py
- Create model UserType
- Create model UserInfo
- Create model UserGroup
- Create model Asset
##
D:\backupAll\eclipseRoot\LearnDjangoDemoT>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK
此时,再次查看数据库day12,数据库day12里面出现了定义的表
在views.py文件内创建login方法
web views.py
#!/usr/bin/env python
#coding:utf-8
from django.shortcuts import render, redirect, render_to_response
# Create your views here.
def login(request):
#定义字典类型的返回消息ret
ret = {'status':''}
#如果有收到客户端的登录请求
if request.method == "POST":
#从客户端发送的POST数据中取key为username的值,若不存在则返回None
username = request.POST.get("username",None)
password = request.POST.get("password",None)
is_auth = all([username,password])
#若用户信息均获取到,则对用户身份做验证
if is_auth:
#在数据库中查询当前用户信息
count = models.UserInfo.objects.filter(username=username,password=password).count()
#若用户信息在数据库中已存在
if count == 1:
return redirect("/web/index/")
else:
ret['status'] = "用户名或密码错误!"
else:
ret['status'] = '用户名或密码不能为空!'
#login方法执行完毕后,返回执行结果
return render_to_response('web/login.html',ret)
def index(request):
return render_to_response('web/index.html')
修改settings文件,规避"CSRF verification failed. Request aborted"错误
项目主页
在web views.py文件中配置项目主页方法
def index(request):
return render_to_response('web/index.html')
在web urls.py文件中配置项目主页URL访问路径
urlpatterns = [
path('login/', views.login),
path('index/', views.index),
]
在templates web目录下创建项目主页HTML页面index.html
<!doctype html>
<html>
<head>
<!--对页面编码进行设置-->
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<!--兼容IE6浏览器-->
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title>demo 10</title>
<style>
.hide{
display:none;
}
.clearfix:after{
content:".";
display:block;
height:0;
clear:both;
visibility:hidden;
}
</style>
</head>
<body>
<h1>主机管理示例</h1>
<ul>
<li><a href="/web/user/ ">用户管理</a></li>
<li><a href="/web/usergroup/ ">用户组管理</a></li>
<li><a href="/web/host ">主机管理</a></li>
</ul>
<!--引入jQuery文件-->
<script src="jquery-1.11.0.min.js"></script>
<script type="text/javascript">
</script>
</body>
</html>
项目主页中的主机管理模块
在web models.py文件中配置主机管理数据库表
class UserGroup(models.Model):
GroupName = models.CharField(max_length=50)
user = models.ManyToManyField('UserInfo')
#资产表:
class Asset(models.Model):
hostname = models.CharField(max_length=256)
ip = models.GenericIPAddressField()
user_group = models.ForeignKey(to='UserGroup',on_delete=models.CASCADE )
#此时,打印Asset对象时输出hostname
#当输出print(类对象)时,"__unicode__"显示什么值,print就输出什么值。即使用"__unicode__"可以任意规定类对象返回(输出)的值。
def __unicode__(self):
print(u'当前Asset对象中包含(%s,%s)' %(self.hostname,self.ip))
return self.hostname
在web views.py文件中配置主机管理模块方法
def host(request):
ret = {'status':'','data':None,'group':None}
usergroup = models.UserGroup.objects.all()
ret['group'] = usergroup
#新建主机
if request.method == 'POST':
hostname = request.POST.get('hostname',None)
ip = request.POST.get('ip',None)
groupId = request.POST.get('group',None)
#验证用户输入是否为空
is_auth = all([hostname,ip])
if is_auth:
#select数据
groupObj = models.UserGroup.objects.get(id=groupId)
#插入数据
models.Asset.objects.create(hostname=hostname,
ip=ip,
user_group=groupObj)
else:
ret['status'] = 'hostname或ip不能为空'
data = models.Asset.objects.all()
#使用user_group__GroupName='用户组B'过滤组名是用户组B的全部资产信息。其中GroupName前面是双下划线
#models.Asset.onjects.filter(user_group__GroupName='用户组B')
#等同于 select * from web_asset LEFT JOIN web_usergroup on web_usergroup.GroupName='用户组B'
ret['data'] = data
return render_to_response('web/host.html', ret)
在web urls.py文件中配置主机管理模块URL访问路径
from django.contrib import admin
from django.urls import path
from web import views
urlpatterns = [
path('login/', views.login),
path('index/', views.index),
path('host/', views.host),
path('register/', views.register),
]
在templates web目录下创建主机管理模块HTML页面
<!doctype html>
<html>
<head>
<!--对页面编码进行设置-->
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<!--兼容IE6浏览器-->
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title>demo 10</title>
<style>
.hide{
display:none;
}
.clearfix:after{
content:".";
display:block;
height:0;
clear:both;
visibility:hidden;
}
.add{
margin:20px;
padding:20px;
border:1px solid #ddd;
}
.list{
padding:20px;
margin:20px;
border:1px solid #ddd;
}
</style>
</head>
<body>
<div class="add">
<h3>添加主机</h3>
<h6 style="color:red;" >{{status}}</h6>
<form action="/web/host/" method="POST">
<p><input name="hostname" placeholder="hostname"></p>
<p><input name="ip" placeholder="ip"></p>
<p>
<select name="group">
{% for item in group %}
<option value="{{ item.id }}">{{ item.GroupName }}</option>
{% endfor %}
</select>
</p>
<p><input type="submit" value="添加" ></p>
</form>
</div>
<div class="list">
<h3>主机列表</h3>
<table border="1">
<tr>
<td>主机名</td>
<td>IP</td>
<td>所属用户组</td>
</tr>
{% for item in data %}
<tr>
<td>{{ item.hostname }}</td>
<td>{{ item.ip }}</td>
<!--获取外联用户组的名称-->
<td>{{ item.user_group.GroupName }}</td>
</tr>
{% endfor%}
</table>
</div>
<!--引入jQuery文件-->
<script src="jquery-1.11.0.min.js"></script>
<script type="text/javascript">
</script>
</body>
</html>
·