最近想做一个数据库网站,我对Python很熟悉,也了解到Django很好用,于是说搞就搞。

首先,在快云上买了一个vps,一元试用一个月,Ubuntu系统。

1.安装Django

apt-get update
apt-get install python-pip python-dev build-essential
python -m pip install django

安装的方法很多,可以自由选用。

2.创建prj和app

#创建项目
django-admin.py startproject test01
./
├── manage.py #管理器
└── test01 #项目目录
├── __init__.py #包文件
├── settings.py #项目配置文件
├── urls.py #URL管理器
└── wsgi.py #服务器连接工具

修改settings.py文件,添加 blog 到 INSTALLED_APPS 中

修改urls.py文件,url(r'^blog/index/$', 'blog.views.index'), 进行网站测试

注意:一定要在项目的根目录里建app,否则会出问题*

from blog.views import index

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/index/$', index),
]
#创建应用
django-admin.py startapp blog
./
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py # 数据库交互器
│   ├── tests.py
│   └── views.py # 视图操作器
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py

修改blog中的views.py文件,添加函数index,

from django.http import HttpResponse
def index(req):
return HttpResponse('<h1>Welcome to Bioinfohub!</h1>')

然后,测试,可以使用shell界面下的 w3m浏览器

python manage.py runserver
w3m http://127.0.0.1:8000/blog/index

OK,测试成功!!!

3.安装和配置Apache2,并连接Django

# 安装
sudo apt-get install apache2

我已经安装过Nginx了,需要停止它

/etc/init.d/nginx stop

编辑配置文件,vim /etc/apache2/apache2.conf,在最后添加一行,不然会报错

ServerName localhost:80
# 安装wsgi模块
sudo apt-get install libapache2-mod-wsgi

后面的报错真是惨不忍睹,好在最终部署成功了,花了我一个多小时。

File "/var/www/mysite/mysite/settings.py", line 29
122.114.29.29,

Django的安装和测试非常简单,上面已经完成了。

Apache的安装和测试也是非常简单,能打开默认的测试页面。

最难的就是让Django和Apache连接在一起!!!

# 安装Apache后,要在末尾加上一句,不然会报错
/etc/apache2/apache2.conf
ServerName localhost:80

然后要在/etc/apache2/sites-available/下新建一个网站的配置文件(文件可以随便命名,亲测),里面一个都不能错。(删除此文件记得还要删除一个../sites-enabled/里面的一个链接文件,否则报错)

然后让配置文件生效,重启Apache

<VirtualHost *:80>
ServerName 122.114.29.29
DocumentRoot /var/www/mysite/mysite
<Directory /var/www/mysite/mysite>
Require all granted
</Directory>
WSGIScriptAlias / /var/www/mysite/mysite/wsgi.py
</VirtualHost>
a2ensite mysite.conf
service apache2 reload

修改mysite/settings.py文件,ip地址必须加上引号,否则会报错!

ALLOWED_HOSTS = [
'122.114.29.29',
]

整个过程没什么难的,最重要的一点就是整个Django项目要存储在/var/www/目录下!!!

因为Apache不能访问/var/www/之外的路径,这个测试页面有写。

测试页面在/var/www/html/index.html,如果只写普通网站就没有什么好配置的了,网站入口就在这,但Django不行。

看到这个页面就成功了,恭喜!

附加学习:

The configuration layout for an Apache2 web server installation on Ubuntu systems is as follows:

/etc/apache2/
|-- apache2.conf # the main configuration file. It puts the pieces together by including all remaining configuration files when starting up the web server.
| `-- ports.conf #It is used to determine the listening ports for incoming connections, and this file can be customized anytime.
|-- mods-enabled #Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/ directories contain particular configuration snippets which manage modules, global configuration fragments, or virtual host configurations, respectively.
| |-- *.load
| `-- *.conf
|-- conf-enabled
| `-- *.conf
|-- sites-enabled
| `-- *.conf

重点来了:

# 默认不能访问其他目录,需要配置
By default, Ubuntu does not allow access through the web browser to any file apart of those located in /var/www, public_html directories (when enabled) and /usr/share (for web applications). If your site is using a web document root located elsewhere (such as in /srv) you may need to whitelist your document root directory in /etc/apache2/apache2.conf. The default Ubuntu document root is /var/www/html. You can make your own virtual hosts under /var/www. This is different to previous releases which provides better security out of the box.

好了,网站有了雏形,下面就可以开始正式搞 数据库 和 数据展示了!

补充:

如何通过Apache绑定多个域名到本主机空间?

修改/etc/apache2/sites-available/test.conf文件,以及Django的settings.py文件。

4.模板

基本测试--使用模板

创建template目录,可以随意命名,但是要去 mysite/settings.py 里修改地址

mkdir blog/templates
TEMPLATES = [
'DIRS': [os.path.join(BASE_DIR, 'templates')],
]

创建模板文件(下面是错误的模板,不能把内容写到<script>里,html是不区分缩进和回车的)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> Bioinfohub </title>
<meta name="Generator" content="NPP-Plugin">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<body>
<script type="text/javascript">
</script>
<h1>Hello Bioinfohub!</h1>
<li>By Li Zhixin</li>
</body>
</html>

修改blog/views.py文件

from django.http import HttpResponse
from django.template import loader, Context def index(req):
t = loader.get_template('index.html')
#c = Context({})
c = {}
return HttpResponse(t.render(c))

注意,新版Django里c必须是字典,而不能是Context格式的对象。

第二种渲染方法,减少重复。

from django.shortcuts import render_to_response
def index(req):
return render_to_response('index.html', {})

模板变量--传入Python变量

<li>{{tool}}: {{function}}</li>
return render_to_response('index.html', {'tool':'BWA','function':'Alignment'})

或者传入字典,然后在模板里用点号来调用。

<li>{{tools.name}}</li>
<li>{{tools.function}}</li>
tools = {'name':'BWA','function':'Alignment'}
return render_to_response('index.html', {'tools':tools})

总结,模板里的变量tools始终是一个字典的key,必须在views中出现。

而views中字典的值就是一个我们要传入的对象,该对象可以是大部分的Python对象,list、dict、class等。

记住,传入模板的始终是一个字典,字典的值是传入的对象。

list可以在模板内使用 list.0 来取出第一个元素。

可以执行类的方法,但是该方法不能有输入参数。

模板标签--选择和循环

{% if tools %}
<li>tools exist</li>
<li>{{tools.name}}</li>
<li>{{tools.function}}</li>
{% else %}
<li>no tools exist</li>
{% endif %}

还可以进行 and or not逻辑操作,但不能合用。

还有关系运算,in运算。

{% for tool in tools %}
<li>{{tool}}</li>
{% endfor %}

还可以遍历values、items

{% for tool in tools.values %}

5.url 配置

可以这样

from blog.views import index

url(r'^index/$', index),

也可以直接

url(r'^index/$', blog.views.index),

后面可以加引号,也可以不加,效果是一样的。

还可以进行模式匹配,关联一系列的URL

url(r'^index/\d{2}/$', index),

还可以从 URL 中输入参数,传递到 views 的方法中

此时需要修改三个文件:

blog/views.py

def index(req, num):
tools = {'name':'BWA','function':'Alignment'}
return render_to_response('index.html', {'tools':tools, 'num':num})

blog/templates/index.html

{% if num %}
<li>num: {{num}}</li>
{% else %}
<li>no num exist</li>
{% endif %}

mysite/urls.py

url(r'^index/(?P<num>\d{2})/$', index),  #给参数取名为 num
url(r'^index/(\d{2})/$', index),  #不取名

6.数据库

安装和配置数据库

推荐使用MySQL数据库,Ubuntu安装也是非常简单

apt-get install mysql-server
apt-get install mysql-client
apt-get install libmysqlclient-dev
sudo netstat -tap | grep mysql
mysql -u root -p
show databases;

转:

一、 启动方式
1、使用 service 启动:service mysql start
2、使用 mysqld 脚本启动:/etc/inint.d/mysql start
3、使用 safe_mysqld 启动:safe_mysql&
二、停止
1、使用 service 启动:service mysql stop
2、使用 mysqld 脚本启动:/etc/inint.d/mysql stop
3、mysqladmin shutdown
三、重启
1、使用 service 启动:service mysql restart
2、使用 mysqld 脚本启动:/etc/inint.d/mysql restart

安装MySQL-python

apt-get install rpm
sudo apt-get install python-setuptools
sudo apt-get install libmysqld-dev
sudo apt-get install libmysqlclient-dev
sudo apt-get install python-dev
sudo easy_install mysql-python python -m pip install mysql-python

测试是否安装成功

import MySQLdb

配置数据库 mysite/settings.py

mysql> create database mysite
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'root',
'PASSWORD': '****',
'HOST': '',
'PORT': '',
}
}

创建表单 blog/models.py

class Employee(models.Model):
name = models.CharField(max_length=20)
        def __unicode__(self):
              return self.name

数据库同步

#在django1.9之前,数据库同步只需要一条命令:
Python manage.py syncdb
#在djang1.9以后,数据库同步执行指令如下:
#同步数据库接口(注意需要切换至python project工作空间所在路径)
python manage.py makemigrations
#同步数据
python manage.py migrate

查看是否成功

mysql> use mysite;
mysql> show tables;
mysql> desc blog_employee;

操作数据

python manage.py shell
>>> from blog.models import Employee
>>> emp = Employee() #或者直接 emp = Employee(name=’lizhixin’)
# 或者直接 Employee.object.create(name=’lizhixin’)
>>> emp.name = "LIZHIXIN"
>>> emp.save()
mysql> select * from blog_employee;  #查看操作记录
Employee.objects.create(name='zhao')
>>> emp = Employee(name='zhang')
>>> emp.save()

遍历数据库

emps = Employee.objects.all()
emps[0].id

使用数据

我去,改回去网页就不能访问了,真是他妈的蛋疼!!!

卧槽,原来是数据库的原因,改成MySQL后原来的网页就无法访问了,改回sqlite就又可以了!!!

VPS空间,centos,reboot后,ssh就连不上了,解决方法。

ubuntu14.04下mysql数据库的默认存放路径并修改

django 1.10版本改了写法了。首先要在引入view模块,其次后面URL设置里views.hello不要加引号了。

emps = Employee.objects.all()

return render_to_response(‘index.html’, {‘emps’:emps})

照常显示{{emps}},可以规范化显示

以下是重点,血泪的经验!!!

断断续续搞了一天,终于解决了这个棘手的问题,压抑了一天的心情终于得到了释放。

问题:学到MySQL数据库时,决定用MySQL替换默认的sqlite,一切看起来是那么简单,安装教程配置好了后却死活打不开网页,停留在 Internal Server Error 页面。

一个莫名的问题来了之后,阵脚就乱了,本来就不熟,各种猜测,各种配置改来改去,都不行,越改越乱,到后面都想重装Ubuntu和Django、Apache了。

还好我冷静了一下,知道瞎改是没用的,然后回来最原来的那个app,开始调错。

完全是无头苍蝇,看着网上的各种乱七八糟的教程,瞎试,事实证明,大多数教程都是垃圾。

通过比较调试,我把问题定位到了数据库问题,因为sqlite可以用。

我感觉是MySQL和Apache的交互问题,但一直都无法深入定位问题。

后来无意在Google里学到了一门内功,apache error log,Internal Server Error 错误太宽泛,你无法定位,想要定位你必须去看Apache的error日志!!!

[Mon Jun 19 14:13:17.981891 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] mod_wsgi (pid=17769): Target WSGI script '/var/www/mysite/mysite/wsgi.py' cannot be loaded as Python module.
[Mon Jun 19 14:13:17.981918 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] mod_wsgi (pid=17769): Exception occurred processing WSGI script '/var/www/mysite/mysite/wsgi.py'.
[Mon Jun 19 14:13:17.981964 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] Traceback (most recent call last):
[Mon Jun 19 14:13:17.981983 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] File "/var/www/mysite/mysite/wsgi.py", line 19, in <module>
[Mon Jun 19 14:13:17.982015 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] application = get_wsgi_application()
[Mon Jun 19 14:13:17.982028 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] File "/usr/local/lib/python2.7/dist-packages/django/core/wsgi.py", line 13, in get_wsgi_application
[Mon Jun 19 14:13:17.982052 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] django.setup(set_prefix=False)
[Mon Jun 19 14:13:17.982061 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 27, in setup
[Mon Jun 19 14:13:17.982073 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] apps.populate(settings.INSTALLED_APPS)
[Mon Jun 19 14:13:17.982079 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 78, in populate
[Mon Jun 19 14:13:17.982090 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] raise RuntimeError("populate() isn't reentrant")
[Mon Jun 19 14:13:17.982106 2017] [:error] [pid 17769] [remote 198.20.87.98:7261] RuntimeError: populate() isn't reentrant

第二门内功,Python报错看最后,锁定错误。

[Mon Jun 19 14:11:17.341368 2017] [:error] [pid 17769] [remote 116.6.99.221:10845]   [
Errno 13] Permission denied: '/var/www/mysite/.python-eggs'

发现,Django会在运行时创建一个临时用户,该用户是没有权限在/var/www目录下写入的!!!

我强行将其目录权限改为777才最终解决了问题。

当然mysite.conf配置文件也要改(其实改不改无所谓)

<VirtualHost *:80>
ServerName 122.114.29.29
DocumentRoot /var/www/mysite/mysite
<Directory /var/www/mysite/mysite>
Require all granted
</Directory>
# WSGIDaemonProcess mysite python-path=/var/www/mysite/mysite:/usr/local/lib/python2.7/dist-packages
# WSGIProcessGroup mysite
WSGIScriptAlias / /var/www/mysite/mysite/wsgi.py
</VirtualHost>

使用Python Django在Ubuntu下搭建数据库型网站的更多相关文章

  1. ubuntu 下 mysql数据库的搭建 及 数据迁移

    1.mysql的安装 我是使用apt-get直接安装的 :sudo apt-get install mysql-server sudo apt-get install mysql-client 2.配 ...

  2. Linux之旅-ubuntu下搭建nodejs环境

    .NET Core也开源了,并且可移植到Linux下,而ubuntu作为linux发行版的翘楚,极大的方便了初学者的入门,搭建完ASP.NET Core运行环境后,作为半前半后的开发人员,就继续着搭建 ...

  3. 在Ubuntu下搭建ASP.NET 5开发环境

    在Ubuntu下搭建ASP.NET 5开发环境 0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要做成 ...

  4. 在Linux(Ubuntu)下搭建ASP.NET Core环境并运行 继续跨平台

    最新教程:http://www.cnblogs.com/linezero/p/aspnetcoreubuntu.html 无需安装mono,在Linux(Ubuntu)下搭建ASP.NET Core环 ...

  5. Ubuntu下搭建NodeJS+Express WEB开发框架

    Ubuntu下搭建NodeJS+Express WEB开发框架 2012-12-27 15:06 作者: NodeJSNet 来源: 本站 浏览: 2,966 次阅读 我要评论暂无评论 字号: 大 中 ...

  6. 如何在Ubuntu下搭建Android NDK开发环境

    1 搭建Android SDK开发环境 参考在在Ubuntu下搭建Android SDK开发环境(图文)首先在Ubuntu下搭建Android SDK开发环境. 2 下载NDK开发包 打开官网: ht ...

  7. Ubuntu下搭建ASP.NET 5

    在Ubuntu下搭建ASP.NET 5开发环境   0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要 ...

  8. 在Ubuntu下搭建FTP服务器的方法

    由于整个学校相当于一个大型局域网,相互之间传送数据非常快,比如要共享个电影,传点资料什么的. 所以我们可以选择搭建一个FTP服务器来共享文件. 那么问题来了,有的同学会问,我们既然在一个局域网内,直接 ...

  9. Ubuntu下搭建FTP服务器

    Ubuntu下搭建FTP服务器 我装的服务器系统是Ubuntu 12.04 LTS,FTP软件当然是选择大名鼎鼎的vsftpd(very secure FTP daemon), 用系统自带的FTP还好 ...

随机推荐

  1. Geometry

    uva1473 这题说的是 在空间中给了n个点 然后用体积最小的圆锥将这些点包含在内可以在表面上, 将这些点 映射到xoz平面上然后,然后枚举每个上凸包的边和每个点的极值进行判断求得最小的体积 我们会 ...

  2. 线程等待——CountDownLatch使用

    告警性能优化过程中,遇到如下问题:1. 在数据库计算几十万个实体的KPI值的方差:2. 计算结果进行表格化处理. 这里KPI包含多个Counter的数据库函数运算(比如Decode,AVG等函数),方 ...

  3. 20165207 Exp4 恶意代码分析

    目录 1.实验内容 1.1.系统运行监控 1.1.1.使用命令行创建计划任务 1.1.2.使用命令行借助批处理文件创建计划任务 1.1.3.分析netstat计划任务的最终结果 1.1.4.安装配置s ...

  4. Applying the Kappa architecture in the telco industry

    https://www.oreilly.com/ideas/applying-the-kappa-architecture-in-the-telco-industry Kappa architectu ...

  5. Linux服务器---网络配置

    禁止ping 有些时候为了保护主机,会禁止其他机器对主机进行ping操作.Ping命令用的是ICMP协议,只要禁用ICMP协议,那么ping方法就无法检测这台主机.关于ICMP协议的配置文件是“/pr ...

  6. 【运维技术】JENKINS管道部署容器化初探

    目标服务器安装docker参考官方文档 https://docs.docker.com/install/linux/docker-ce/centos/ (可选)在目标服务器上安装docker私服 ht ...

  7. SaltStack安装及配置

    1.简介SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,一般可以理解为简化版的puppet和加强版的func.SaltStack基于Python语言实现,结合 ...

  8. CSS style 属性

    CSS style 属性 定义和用法 必需的 type 属性规定样式表的 MIME 类型. type 属性指示 <style> 与 </style> 标签之间的内容. 值 &q ...

  9. jQuery 对象

    jQuery 对象 版权声明:未经博主授权,严禁转载分享 什么是 jQuery 对象 jQuery 对象是通过 jQuery 包装 DOM 对象后产生的对象. jQuery 对象是一个类数组对象. j ...

  10. 利用构建缓存机制缩短Docker镜像构建时间

    在使用Docker部署PHP或者node.js应用时,常用的方法是将代码和环境镜像打包成一个镜像然后运行,一些云厂商提供了非常便捷的操作,只需要把我们的代码提交到VCS上,然后它们就会帮我们拉取代码并 ...