最近想做一个数据库网站,我对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. Keepalived 安装

    Keepalived 安装安装环境 keepalived-1.2.18.tar.gz VM虚拟机redhat6.5-x64:192.168.1.201 Xshell4 部署方案 201部署 安装步骤  ...

  2. Python 读写文件中w与wt, r与rt的区别

    w和wt是一们的,r和rt是一样的,t是默认参数,可以省略的,help(open)就能看到open的参数的详细说明. w,r,wt,rt都是python里面文件操作的模式.w是写模式,r是读模式.t是 ...

  3. hive支持sql大全(收藏版)

    hive操作数据库还是比较方便的,因此才会有hbase与hive整合.下面我们hive的强大功能吧.为了增强阅读性,下面提几个问题: 1.hive支持哪些运算符? 2.hive是否支持左右连接? 3. ...

  4. php 字符串长度函数

    php 字符串长度函数 php 字符串长度函数,在php测试字符串长度的函数有二个,一个是strlen,另一个是mb_strlen前一个默认是支持,后一个需要开启一个插件,下面我们来介绍一下二个函数的 ...

  5. Oracle 11g调用函数几种常用方法

    1. 该函数接受3个可选参数,返回3个数字的和 CREATE OR REPLACE FUNCTION add_three_numbers ( a NUMBER:=0, b NUMBER:=0, c N ...

  6. bzoj1654 / P2863 [USACO06JAN]牛的舞会The Cow Prom

    P2863 [USACO06JAN]牛的舞会The Cow Prom 求点数$>1$的强连通分量数,裸的Tanjan模板. #include<iostream> #include&l ...

  7. 20145333茹翔 Exp5 MS08_067漏洞测试

    20145333茹翔 Exp5 MS08_067漏洞测试 实验过程 IP:kali:192.168.31.177.windows 2003 :192.168.31.223 使用命令msfconsole ...

  8. 強化 Python 在 Vim 裡的顏色

    我習慣用 putty 連 Unix server 開 screen,再用 vim 寫 Python.這篇記錄如何改善 Python 的顏色. 啟動 256 色 terminal 首先將可用的色彩數增加 ...

  9. windows10下使用source insight出现"source insight program editor已停止工作"的问题

    一.背景 1.1 OS 版本 windows 10 1.2 source insight版本 source insight 3.50.0034 二.解决方案 删除"我的文档"下面的source ins ...

  10. 啤酒和饮料|2014年蓝桥杯B组题解析第一题-fishers

    啤酒和饮料|2014年第五届蓝桥杯B组题解析第一题-fishers 啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道他买的啤酒比饮料的数量少,请 ...