准备四个html静态文件
1.login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
<style>
#container {
width: 520px;
margin: 10px auto;
}
.input {
margin: 20px 0;
width: 460px;
height: 40px;
}
.input>label {
display: inline-block;
width: 140px;
text-align: right;
}
.input>img {
width: 150px;
vertical-align: middle;
}
input[name=captcha] {
vertical-align: middle;
}
form+div {
margin-top: 20px;
}
form+div>a {
text-decoration: none;
color: darkcyan;
font-size: 1.2em;
}
.button {
width: 500px;
text-align: center;
margin-top: 20px;
}
</style>
</head>
<body>
<div id="container">
<h1>用户登录</h1>
<hr>
<form action="" method="post">
<fieldset>
<legend>用户信息</legend>
<div class="input">
<label>用户名:</label>
<input type="text" name="username">
</div>
<div class="input">
<label>密码:</label>
<input type="password" name="password">
</div>
<div class="input">
<label>验证码:</label>
<input type="text" name="captcha">
<img src="images/captcha.jpg" alt="" width="150" height="40">
</div>
</fieldset>
<div class="button">
<input type="submit" value="登录">
<input type="reset" value="重置">
</div>
</form>
<div>
<a href="subjects.html">返回首页</a>
<a href="register.html">注册新用户</a>
</div>
</div>
</body>
</html>
2.register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
<style>
#container {
width: 520px;
margin: 20px auto;
}
.input {
margin: 20px 20px;
width: 450px;
height: 40px;
}
.input>label {
display: inline-block;
width: 150px;
text-align: right;
}
a {
text-decoration: none;
color: darkcyan;
}
form+div {
margin-top: 20px;
}
form+div>a {
font-size: 1.2em;
}
.button {
width: 520px;
margin-top: 10px;
text-align: center;
}
.button>div {
text-align: left;
margin: 10px 10px;
}
</style>
</head>
<body>
<div id="container">
<h1>用户注册</h1>
<hr>
<form action="" method="post">
<fieldset>
<legend>用户信息</legend>
<div class="input">
<label>用户名:</label>
<input type="text" name="username" required minlength="4" maxlength="20">
</div>
<div class="input">
<label>密码:</label>
<input type="password" name="password">
</div>
<div class="input mobile">
<label>手机号:</label>
<input type="tel" name="tel">
<input type="button" id="sendBtn" value="发送验证码">
</div>
<div class="input">
<label>验证码:</label>
<input type="text" name="mobilecode">
</div>
</fieldset>
<div class="button">
<input type="submit" value="注册">
<input type="reset" value="重置">
<div>
<input type="checkbox">
我已经同意网站<a href="">用户协议及隐私政策</a>
</div>
</div>
</form>
<div>
<a href="subjects.html">返回首页</a>
<a href="login.html">返回登录</a>
</div>
</div>
</body>
</html>
3.subjects.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学科信息</title>
<style>
#container {
width: 80%;
margin: 10px auto;
}
.user {
float: right;
margin-right: 10px;
}
.user>a {
margin-right: 10px;
}
#main>dl>dt {
font-size: 1.5em;
font-weight: bold;
}
#main>dl>dd {
font-size: 1.2em;
}
a {
text-decoration: none;
color: darkcyan;
}
</style>
</head>
<body>
<div id="container">
<div class="user">
<a href="login.html">用户登录</a>
<a href="register.html">快速注册</a>
</div>
<h1>北京千锋互联科技有限公司所有学科</h1>
<hr>
<div id="main">
<dl>
<dt>
<a href="teachers.html">Python全栈+人工智能</a>
<img src="images/hot-icon-small.png">
</dt>
<dd>
Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/)是一种广泛使用的解释型、高级编程、通用型编程语言,
由吉多·范罗苏姆创造,第一版发布于1991年。可以视之为一种改良(加入一些其他编程语言的优点,如面向对象)的LISP。
Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。
相比于C++或Java,Python让开发者能够用更少的代码表达想法。不管是小型还是大型程序,该语言都试图让程序的结构清晰明了。
</dd>
</dl>
<dl>
<dt>
<a href="">全栈软件测试</a>
</dt>
<dd>
软件测试在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
软件测试有许多方法,但对复杂的产品运行有效测试不仅仅是研究过程,更是创造并严格遵守某些呆板步骤的大事。
测试的其中一个定义:为了评估而质疑产品的过程;这里的“质疑”是测试员试着对产品做的事,而产品以测试者脚本行为反应作为回答。
</dd>
</dl>
<dl>
<dt>
<a href="">JavaEE+分布式开发</a>
<img src="images/hot-icon-small.png">
</dt>
<dd>
Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
该语言由当时任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,
目标设置在家用电器等小型系统的编程语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。
由于这些智能化家电的市场需求没有预期的高,太阳计算机系统(Sun公司)放弃了该项计划。
随着1990年代互联网的发展,Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。
Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
</dd>
</dl>
</div>
</div>
</body>
</html>
4.teachers.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>老师信息</title>
<style>
#container {
width: 80%;
margin: 10px auto;
}
.teacher {
width: 100%;
margin: 0 auto;
padding: 10px 0;
border-bottom: 1px dashed gray;
overflow: auto;
}
.teacher div {
float: left;
}
.photo {
height: 140px;
border-radius: 75px;
overflow: hidden;
margin-left: 20px;
}
.info {
width: 75%;
margin-left: 30px;
}
.info div {
clear: both;
margin: 5px 10px;
}
.info span {
margin-right: 25px;
}
.info a {
text-decoration: none;
color: darkcyan;
}
.user {
float: right;
margin: 10px 10px;
}
.user+h1 {
clear: both;
}
#photo {
border-radius: 32px 32px 32px 32px;
}
</style>
</head>
<body>
<div id="container">
<h1>Python全栈+人工智能学科的老师信息</h1>
<hr>
<div class="teacher">
<div class="photo">
<img src="images/luohao.png" height="140" alt="">
</div>
<div class="info">
<div>
<span><strong>姓名:骆昊</strong></span>
<span>性别:男</span>
<span>出生日期:1980年11月28日</span>
</div>
<div class="intro">
10年以上软硬件产品和系统设计、研发、架构和管理经验,2003年毕业于四川大学,四川大学Java技术俱乐部创始人,
四川省优秀大学毕业生,在四川省网络通信技术重点实验室工作期间,参与了2项国家自然科学基金项目、
1项中国科学院中长期研究项目和多项四川省科技攻关项目,在国际会议和国内顶级期刊上发表多篇论文(1篇被SCI收录,3篇被EI收录),
大规模网络性能测量系统DMC-TS的设计者和开发者,perf-TTCN语言的发明者。国内最大程序员社区CSDN的博客专家,
在Github上参与和维护了多个高质量开源项目,精通C/C++、Java、Python、R、Swift、JavaScript等编程语言,
擅长OOAD、系统架构、算法设计、协议分析和网络测量,主持和参与过电子政务系统、KPI考核系统、P2P借贷平台等产品的研发,
一直践行“用知识创造快乐”的教学理念,善于总结,乐于分享。
</div>
<div class="comment">
<a href="">好评</a> (<strong>100</strong>)
<a href="">差评</a> (<strong>50</strong>)
</div>
</div>
</div>
<div class="teacher">
<div class="photo">
<img src="images/yuting.png" height="140" alt="">
</div>
<div class="info">
<div>
<span><strong>姓名:余婷</strong></span>
<span>性别:女</span>
<span>出生日期:1992年9月20日</span>
</div>
<div class="intro">
5年以上移动互联网项目开发经验和教学经验,曾担任上市游戏公司高级软件研发工程师和移动端(iOS)技术负责人,
参了多个企业级应用和游戏类应用的移动端开发和后台服务器开发,拥有丰富的开发经验和项目管理经验,
以个人开发者和协作开发者的身份在苹果的AppStore上发布过多款App。精通Python、C、Objective-C、Swift等开发语言,
熟悉iOS原生App开发、RESTful接口设计以及基于Cocos2d-x的游戏开发。授课条理清晰、细致入微,
性格活泼开朗、有较强的亲和力,教学过程注重理论和实践的结合,在学员中有良好的口碑。
</div>
<div class="comment">
<a href="">好评</a> (<strong>50</strong>)
<a href="">差评</a> (<strong>100</strong>)
</div>
</div>
</div>
</div>
</body>
</html>
修改静态HTML文件为模板,为动态页面做准备
在subjuects.html下
<hr>
<div id="main">
{% for subject in subjects %}
<dl>
<dt>
<a href="teachers.html">{{ subject.name }}</a>
{% if subject.is_hot %}
<img src="images/hot-icon-small.png">
{% endif %}
</dt>
<dd>{{ subject.intro }}</dd>
</dl>
{% endfor %}
</div>
</div>
</body>
</html>
修改views.py
def show_subject(request):
return render(request,'subjects.html',{'subject':[]})
在修改urls.py文件的路径
form polls.views import show_subject
path=['',show_subject]
创建数据库
create database vote default charset utf8; -- 创建数据库
create user 'hellokitty'@'%' identified by '密码'; -- 创建用户
grant all privileges on vote.* to 'hellokitty'@'%'; -- 授权
flush privileges; -- 刷新权限
use vote; -- 使用vote数据库
create table `tb_subject`
(`no` int(11) not null auto_increment, -- 学科编号
`name` varchar(20) not null, -- 学科名称
`intro` varchar(1000) default '', -- 学科介绍
`is_hot` tinyint(1) default '0', -- 热度是否为真,默认为假
primary key (`no`) -- 设置主键
);
修改Django配置文件setting.py
找到DATABASE这个变量,修改连接mysql的配置
DATABASE = {
'default':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'vote',
'HOST':'服务器地址',
'PORT':3306,
'USER':'hellokitty',
'PASSWORD':'数据库密码',
'CHARSET':'utf8',
'TIME_ZONE':'Asia/Shanghai'}
}
装连接数据库的依赖项(django兼容mysqlclient,不兼容pymysql)
!!!装mysqlclient就不需要修改以下内容!!!
如果装pymysql的话得修改文件,在根路径下(这个django项目)文件下找到 __init__.py在里面写代码
import pymysql
pymysql.install_as_MySQLdb()
点击这个方法修改第三方库代码,在120行
def install_as_MySQLdb():
global version_info #加这个全局声明
version_info = (1,4,2,'final',0) #修改版本号,达到欺骗django的行为
sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"]
重启django服务,还是会报错,点击报错文件operations.py点击进去修改146行代码
在 def last_executed_query(self,cursor,sql,parms):下改解码为编码
def last_executed_query(self,cursor,sql,parms)
query = getattr(cursor, '_executed', None)
if query is not None:
query = query.encode(errors='replace') #修改这段代码decode为encode
return query
在次重启django服务就可以了(项目部署linux上必须用mysqlclient)
----------------------------------------------------------------------------------------------
在setting.py中修改应用配置39行代码以下列表中加上自己创建的应用名(本文创建为polls)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls'
]
给polls/models.py中映射数据库的表(吧数据库中的表映射为python中的类,方便开发)
当前虚拟环境终端中输入:
python manage.py inspectdb > polls/models.py
类名自动写为TBSubject 、删除掉TB、更为优雅
数据库连接池
安装
pip install django-db-connection-pool
修改Django的配置文件
# change django.db.backends.mysql to dj_db_conn_pool.backends.mysql:
DATABASES = {
'default': {
...
'ENGINE': 'dj_db_conn_pool.backends.mysql' #oracle/postgresql
...
}
}
连接池选项
# 方式一:
DATABASES = {
'default': {
...
'POOL_OPTIONS' : {
'POOL_SIZE': 10,
'MAX_OVERFLOW': 10
}
...
}
}
# 方式二:
import dj_db_conn_pool
dj_db_conn_pool.setup(pool_size=100, max_overflow=50)
注:
目前连接池限制用户传入的连接池配置为:POOL_SIZE(连接池容量)、MAX_OVERFLOW(连接池容量向上浮动最大值) 这两个参数包含在 POOL_OPTIONS 内,例如下面的配置,default 的连接池常规容量为10个连接,最大浮动10个, 即为:在 default 连接池创建后,随着程序对连接池的请求,连接池内连接将逐步增加到10个,如果在连接池内连接 全部用光后,程序又请求了第11个连接,此时的连接池容量将短暂超过 POOL_SIZE,但最大不超过 POOL_SIZE + MAX_OVERFLOW, 如果程序请求 default 数据库的连接数量超过 POOL_SIZE + MAX_OVERFLOW,那么连接池将一直等待直到程序释放连接, 请注意线程池对数据库连接池的使用,如果线程池大于连接池,且线程无主动释放连接的动作,可能会造成其他线程一直阻塞
查询数据库当前连接数
show status like ‘Threads%’;
查询数据库当前设置的最大连接数
show variables like ‘%max_connections%’;
可以在/etc/my.cnf里面设置数据库的最大连接数
max_connections = 500