以前整理的流程因为期末考试的原因都比较散,现在考完,直接在vm用centos过了一遍django流程,谨记于此
首先呢就是环境的配置,在centos7上最好使用python3进行django学习建站,并将安装包pip工具升级到最新,
cnetos7终端创建django项目并为项目使用python3自带的venv创建虚拟并激活虚拟环境(项目的运行即是在虚拟环境中运行,相当于与系统上的python环境隔离开来,只不过虚拟环境的各种第三方库是需要重新安装的):
django-admin startproject centosdjango
cd centosdjango
python -m venv venv
source venv/bin/activate
#在虚拟环境中安装一下django必要的库(这里由于本机使用p3.6,安装django2.0,并且django1.11与django2.0之间项目配置文件之间会有许多不同)
pip install django==2.0
pip install pillow
pip install pymysql
pip install requests
至此运行项目就可以在本机端口查看项目了,不过啥都没有
#可以在项目文件夹中修改settings.py文件修改时区与语言
下面开始创建应用
#此操作会在项目文件夹所在目录创建应用文件夹包含应用所需要的必要配置文件
python manage.py startapp hrs
修改应用文件夹下的view.py文件
#字如其名,此文件用来设置展示给用户的界面代码(html)
from django.http import HttpResponse
def index(request):
return HttpResponse('<h1>Hello, Django!</h1>')
此时应用目录还没有与此对应的urls.py文件,创建一个这样的文件,相当于告诉系统当打开此应用时那么就运行views.py文件展示:
(venv)$ touch hrs/urls.py
(venv)$ vim hrs/urls.py
from django.urls import path
from hrs import views
urlpatterns = [
path('', views.index, name='index'),
]
此时还要修改项目文件夹下面的urls.py 文件对应用的url进行明确
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('hrs/', include('hrs.urls')),
]
至此运行项目并访问本机端口http://localhost:8000/hrs,页面会对你说hello django!
下面使用视图模板来更换views.py提高项目工作效率:
首先创建一个用来存放模板页的文件夹在项目文件夹所在的目录中:
(venv)$ mkdir templates
(venv)$ touch templates/index.html
(venv)$ vim templates/index.html
并写入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>部门信息</h1>
<hr>
<table>
<tr>
<th>部门编号</th>
<th>部门名称</th>
<th>所在地</th>
</tr>
{% for dept in depts_list %}
<tr>
<td>{{ dept.no }}</td>
<td>{{ dept.name }}</td>
<td>{{ dept.location }}</td>
<tr>
{% endfor %}
</table>
</body>
</html>
并修改应用文件夹下的views.py文件:
#使之能够调用此模板页并对模板页进行信息填充
from django.shortcuts import render
depts_list = [
{'no': 10, 'name': '财务部', 'location': '北京'},
{'no': 20, 'name': '研发部', 'location': '成都'},
{'no': 30, 'name': '销售部', 'location': '上海'},
]
def index(request):
return render(request, 'index.html', {'depts_list': depts_list})
并修改项目文件夹下面的settings.py使得render函数能够对接模板页
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
至此运行项目可见效果
需求得django功能肯定不止这些,接下来就将应用添加到已安装得项目中,并为自己的项目配置mysql数据库,修改项目文件夹得settings.py文件:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'hrs',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'oa',
'HOST': '1.2.3.4',
'PORT': 3306,
'USER': 'yourname',
'PASSWORD': 'yourpass',
}
}
(对python3)同时修改项目文件夹的__init__.py文件将pymysql当作mysqldb,避免找不到MySQL的客户端工具:
import pymysql
pymysql.install_as_MySQLdb()
既然我们为项目配置了数据库,那么理所当然给项目在mysql中创建数据库,(名字与settings.py文件中对应)
初次为项目创建数据库,需要执行模型迁移工作,根据模型生成数据需要的额二维表,(每次为项目增添或删改模型都需要迁移操作),
(venv)$ 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 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 sessions.0001_initial... OK
下面为应用创建数据模型:
修改对应应用的模型文件:
(venv)$ vim hrs/models.py
from django.db import models
class Dept(models.Model):
"""部门类"""
no = models.IntegerField(primary_key=True, db_column='dno', verbose_name='部门编号')
name = models.CharField(max_length=20, db_column='dname', verbose_name='部门名称')
location = models.CharField(max_length=10, db_column='dloc', verbose_name='部门所在地')
class Meta:
db_table = 'tb_dept'
class Emp(models.Model):
"""员工类"""
no = models.IntegerField(primary_key=True, db_column='eno', verbose_name='员工编号')
name = models.CharField(max_length=20, db_column='ename', verbose_name='员工姓名')
job = models.CharField(max_length=10, verbose_name='职位')
# 多对一外键关联(自参照)
mgr = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='主管')
sal = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='月薪')
comm = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True, verbose_name='补贴')
# 多对一外键关联(参照部门模型)
dept = models.ForeignKey(Dept, db_column='dno', on_delete=models.PROTECT, verbose_name='所在部门')
class Meta:
db_table = 'tb_emp'
并再次执行迁移操作,通过模型生成迁移文件,并再次执行生成二维表:
#可以看出来在项目的构建中每次修改或删除模型都需要这两步,1、通过模型生成迁移文件,2、执行生成二维表
(venv)$ python manage.py makemigrations hrs
Migrations for 'hrs':
hrs/migrations/0001_initial.py
- Create model Dept
- Create model Emp
(venv)$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, hrs, sessions
Running migrations:
Applying hrs.0001_initial... OK
至此还需要在应用的admin.py文件中,对新添的模型进行注册:
from django.contrib import admin
from hrs.models import Emp, Dept
admin.site.register(Dept)
admin.site.register(Emp)
这样来,在后台中创建django的超级用户并登录即可看到自己的模型,且用户每次在网站中修改数据,都会同步更新到数据库中,(其实这时候就相当于将电脑当作了服务器来运行这个django项目网站)
创建超级用户:
(venv)$ python manage.py createsuperuser
Username (leave blank to use 'hao'): jackfrued
Email address: jackfrued@126.com
Password:
Password (again):
Superuser created successfully.
并登入可以看到相应的后台管理的功能
至此只完成了后台的管理,且后台管理并没有同步到前端显示,http://127.0.0.1:8000/hrs
还可以使用django内置提供的shell进行后台管理:
python manage.py shell
以上从开始至此对应的为centos7中的centosdjango项目
为django项目的静态资源配置
首先先温习一下django建立项目的流程,首先为项目创建的mysql数据库是必须的,为项目创建应用并为网站管理建立模型,并同时在应用文件夹中的admin文件中进行模型的注册,和为项目文件夹下的设置文件settings.py添加app应用,随后进行数据库的迁移操作,为模型生成相应的二维表,同时修改项目文件下的__init__.py文件对数据库进行必要的说明,至此后台管理需要的必要条件全部完成,剩下的工作就是为你创建的模型添加数据了,随后进行前端网页的设置,首先修改应用的视图文件views.py编写需求功能的视图函数(这函数最后是在进行项目url设置的时候需要进行导入),导入视图函数的时候势必需要使用到模板页的功能,为此最好在项目文件夹所在目录建立专门的文件夹进行模板页的保存,并同时在项目文件夹中设置settings文件对TEMPLATES的dir进行设置,使视图函数中的render函数能够对接模板页,
最后进行静态资源的配置
一般是在模板页中使用引用静态资源的模板指令进行使用静态资源,静态资源实际上就是存储在服务器中的css,js,impage文件用来进行前端资源的展示,要使用该指令,首先要使用{% load static %}指令来加载静态资源,我们将这段代码放在了页码开始的位置。在上面的项目中,我们将静态资源置于名为static的文件夹中,在该文件夹下又创建了三个文件夹:css、js和images,分别用来保存外部层叠样式表、外部JavaScript文件和图片资源。为了能够找到保存静态资源的文件夹,我们还需要修改Django项目的配置文件settings.py,如下所示:
# 此处省略上面的代码
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
STATIC_URL = '/static/'
# 此处省略下面的代码
在模板页中引用静态资源与对模型数据的对接实例:
#注意在模板页中的诸如subject.name与teacher.gender都是模板页用来对接使用在后台中的模型数据的
#而引用静态资源指令:
的意思相当于在服务器中的static文件夹中寻找文件名为teacher.photo(这里指的是对应的模型数据)的图片。
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>老师信息</title>
<style>/* 此处略去了层叠样式表的选择器 */</style>
</head>
<body>
<h1>{{ subject.name }}学科老师信息</h1>
<hr>
{% if teachers %}
<div id="container">
{% for teacher in teachers %}
<div class="teacher">
<div class="photo">
<img src="{% static teacher.photo %}" height="140" alt="">
</div>
<div class="info">
<div>
<span><strong>姓名:{{ teacher.name }}</strong></span>
<span>性别:{{ teacher.gender | yesno:'男,女' }}</span>
<span>出生日期:{{ teacher.birth }}</span>
</div>
<div class="intro">{{ teacher.intro }}</div>
<div class="comment">
<a href="">好评({{ teacher.good_count }})</a>
<a href="">差评({{ teacher.bad_count }})</a>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<h2>暂时没有该学科的老师信息</h2>
{% endif %}
<div class="back">
<a href="/"><< 返回学科</a>
</div>
</body>
</html>
最后在项目文件中修改urls.py文件对项目url进行指定:
from django.contrib import admin
from django.urls import path
from vote import views
urlpatterns = [
path('', views.show_subjects),
path('teachers/', views.show_teachers),
path('admin/', admin.site.urls),
]
以上从静态资源至此的项目对应的centos7中ajaxdjango项目
下面总结了三种向网站中的模型添加数据的方法
1、 第一种想当然就是直接进入网站后台管理页面进行仪表盘管理,手动添加即可。
2、 第二种方法就是进入后台数据库进行数据的添加,MySQL数据库,不过在数据库中进行添加时注意编号的问题若要添加的自加数据编号与数据库中已有的数据编号重叠,那么就会直接亲切的报错。
3、 第三种方法就是在django提供的shell中进行添加,要注意的是语法问题,而且遇到与第二种方法数据重叠时,在shell中不会报错,而会直接替换掉原有的数据。
下面进行ajax请求的实现介绍:
以为一位老师点赞的实例来进行介绍ajax:
首先要修改项目文件夹中的urls.py文件对点赞请求的网址进行合并,并在其后面引入需要的视图函数:
且使用视图函数实现我们需要的功能:即将页面中的好评数或者差评数加一:
该函数通过django封装的JsonResponse将字典序列化为json字符串作为返回给浏览器的响应,而在模板页中会利用引入的jqury库根据这个响应来进行前端页面中的好评数即差评数的修改,而对模型数据的修改是对后台来说的,如果说只修改模型数据的话,那么就必须重新加载整个页面才能达到更新数据的效果,那么ajax技术也就无从谈起,如下模板页:
可以看到是在事件处理中进行的前端数据的更新。下一步是为这个我的小型的django学习项目提供用户注册与登录的功能:
首先总结一下在添加功能时得到的对django的各配置文件的感性认识:
首先是模型与注册模型之间的关系,对模型models文件的类修改,在模型中添加数据是对服务器端的数据的改动,也就是对接的服务器,而视图函数中则是实现对前端输入数据的判断与继承模型数据进行对接前端页面的功能,而对模型的注册是在admin文件中进行注册,而在这里主要则是对模型数据的对接与规定在django自带后台中的数据展示的要求。
而在视图函数中,对前端数据的更新则主要是应用render函数进行修改,render函数根据模板页中的id寻找相应元素并修改内容,如:
对指定页面id元素的修改:
发出请求:
或者表单的信息检查:
对于表单的应用:
主要是在视图函数文件中对forms.ModelForm类的继承或者是froms.Form,根据模板页中id对元素进行检索并检测格式等,如进行数据格式的检验:
**
cookie与session:
**
cookie:(听说这个不太常用,不太安全)
是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录用户个人信息的功能, 而这一切都不必使用复杂的CGI等程序。
session:(主要是用户的网页登录等控制)
在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。
实现session:
有三种方法:
一种是url的重写将session生成的id添加到url中,一种是将隐藏信息存于表单中向浏览器提交数据,最后一种是本地存储。现在的浏览器都支持多种本地存储方案,包括:cookie、localStorage、sessionStorage、IndexedDB等。在这些方案中,cookie是历史最为悠久也是被诟病得最多的一种方案。
django封装的读写cookie的操作:
django中间件应用:
比如为在这个项目的点赞功能,设置未登录的用户必须先登录才可以投票的功能时,那我在视图函数中就需要设置判断页面表单中是否登录的代码,这只是一个小项目,如果项目比较大的话,视图函数中会充斥着这样判断是否登录的重复代码,那么中间件就是用来解决这个问题的:
中间件:
中间件是安插在Web应用请求和响应过程之间的组件,它在整个Web应用中扮演了拦截过滤器的角色,通过中间件可以拦截请求和响应,并对请求和响应进行过滤(简单的说就是执行额外的处理)。通常,一个中间件组件只专注于完成一件特定的事,例如:Django框架通过SessionMiddleware中间件实现了对session的支持,又通过AuthenticationMiddleware中间件实现了基于session的请求认证。通过把多个中间件组合在一起,我们可以完成更为复杂的任务,Django框架就是这么做的。
django项目文件中的配置文件就包含对这些中间件的设置:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
我们可以自定义一个中间件并加入到配置文件中去,从而实现一些功能,比如上面提到的点赞之前的用户登录的验证,且自定义的中间件文件是添加到应用目录下的,并使用函数的写法实现需求的功能,最后修改配置文件,激活中间件。
在MIDDLEWARE中添加:
'vote.middlewares.check_login_middleware',
日志
在网站的运营中,或许会因为一些原因,网站会出现一些问题,产生一些错误,而日志的功能就是将这些错误信息记录下来并写成日志文件,方便技术人员翻阅这些错误文档,以方便对网站的问题进行修复。
而为我们的django项目添加记录debug日志的功能需要修改项目文件夹下的settings.py文件添加如下,基本模板配置可以在django官方文档中找到,如下:
LOGGING = {
'version': 1,
# 是否禁用已经存在的日志器
'disable_existing_loggers': False,
# 日志格式化器
'formatters': {
'simple': {
'format': '%(asctime)s %(module)s.%(funcName)s: %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S',
},
'verbose': {
'format': '%(asctime)s %(levelname)s [%(process)d-%(threadName)s] '
'%(module)s.%(funcName)s line %(lineno)d: %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S',
}
},
# 日志过滤器
'filters': {
# 只有在Django配置文件中DEBUG值为True时才起作用
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
# 日志处理器
'handlers': {
# 输出到控制台
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG',
'filters': ['require_debug_true'],
'formatter': 'simple',
},
# 输出到文件(每周切割一次)
'file1': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': 'access.log',
'when': 'W0',
'backupCount': 12,
'formatter': 'simple',
'level': 'INFO',
},
# 输出到文件(每天切割一次)
'file2': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': 'error.log',
'when': 'D',
'backupCount': 31,
'formatter': 'verbose',
'level': 'WARNING',
},
},
# 日志器记录器
'loggers': {
'django': {
# 需要使用的日志处理器
'handlers': ['console', 'file1', 'file2'],
# 是否向上传播日志信息
'propagate': True,
# 日志级别(不一定是最终的日志级别)
'level': 'DEBUG',
},
}
}
对其中各个参数的解释:
上面日志配置中的formatters是日志格式化器,它代表了如何格式化输出日志,其中格式占位符分别表示:
%(name)s - 记录器的名称
%(levelno)s - 数字形式的日志记录级别
%(levelname)s - 日志记录级别的文本名称
%(filename)s - 执行日志记录调用的源文件的文件名称
%(pathname)s - 执行日志记录调用的源文件的路径名称
%(funcName)s - 执行日志记录调用的函数名称
%(module)s - 执行日志记录调用的模块名称
%(lineno)s - 执行日志记录调用的行号
%(created)s - 执行日志记录的时间
%(asctime)s - 日期和时间
%(msecs)s - 毫秒部分
%(thread)d - 线程ID(整数)
%(threadName)s - 线程名称
%(process)d - 进程ID (整数)
日志配置中的handlers用来指定日志处理器,简单的说就是指定将日志输出到控制台还是文件又或者是网络上的服务器,可用的处理器包括:
logging.StreamHandler(stream=None) - 可以向类似与sys.stdout或者sys.stderr的任何文件对象输出信息
logging.FileHandler(filename, mode=’a’, encoding=None, delay=False) - 将日志消息写入文件
logging.handlers.DatagramHandler(host, port) - 使用UDP协议,将日志信息发送到指定主机和端口的网络主机上
logging.handlers.HTTPHandler(host, url) - 使用HTTP的GET或POST方法将日志消息上传到一台HTTP 服务器
logging.handlers.RotatingFileHandler(filename, mode=’a’, maxBytes=0, backupCount=0, encoding=None, delay=False) - 将日志消息写入文件,如果文件的大小超出maxBytes指定的值,那么将重新生成一个文件来记录日志
logging.handlers.SocketHandler(host, port) - 使用TCP协议,将日志信息发送到指定主机和端口的网络主机上
logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0) - 将日志输出到指定的邮件地址
logging.MemoryHandler(capacity, flushLevel=ERROR, target=None, flushOnClose=True) - 将日志输出到内存指定的缓冲区中
上面每个日志处理器都指定了一个名为“level”的属性,它代表了日志的级别,不同的日志级别反映出日志中记录信息的严重性。Python中定义了六个级别的日志,按照从低到高的顺序依次是:NOTSET、DEBUG、INFO、WARNING、ERROR、CRITICAL。
最后配置的日志记录器是用来真正输出日志的,Django框架提供了如下所示的内置记录器:
django - 在Django层次结构中的所有消息记录器
django.request - 与请求处理相关的日志消息。5xx响应被视为错误消息;4xx响应被视为为警告消息
django.server - 与通过runserver调用的服务器所接收的请求相关的日志消息。5xx响应被视为错误消息;4xx响应被记录为警告消息;其他一切都被记录为INFO
django.template - 与模板渲染相关的日志消息
django.db.backends - 有与数据库交互产生的日志消息,如果希望显示ORM框架执行的SQL语句,就可以使用该日志记录器。
日志记录器中配置的日志级别有可能不是最终的日志级别,因为还要参考日志处理器中配置的日志级别,取二者中级别较高者作为最终的日志级别。
配置Django-Debug-Toolbar
Django-Debug-Toolbar是辅助Django项目开发的神器,只要配置了它,就可以很方便的查看到以下内容,这些信息对了解项目的运行状况以及优化Web应用性能都是至关重要的。