python django创建一个属于自己的动态网站
您如何开始使用Python创建网站?好吧,你可以自己完成所有工作,并编写一个在Web服务器上运行的程序,接受页面请求并以HTML和其他资源的形式提供响应。然而,这是很多工作,那么为什么在有大量现有工具为您完成工作时会遇到麻烦呢?这些工具称为框架,它们是我们今天用来创建我们网站的东西。
Python框架
有很多Python Web框架,但这里有一些最好的:
- Django - 我们今天要用它。它具有大量功能,但仍然易于使用。文档也非常好,所以如果你遇到困难,你将有最简单的时间来解决你的Django问题。
- Grok - 另一个具有接近Django的功能集的框架。如果你决定不喜欢Django,这是一个很好的选择。
- WebPy - 一个更轻量级的框架。它没有那么多的功能,虽然它确实为Reddit供电了一段时间!
- TurboGears - 虽然以前因文档不佳而声名远播,但TurboGears在去年已大幅改善。
如果您需要其他选项,可以在Python网站上找到 更全面的列表。今天我们将在本地机器上设置Django进行开发,然后构建一个简单的博客。我们还将审查在远程Web服务器上安装它的过程。
安装Django
我们今天将在终端中完成大部分工作。这应该都适用于Mac和Linux; 但是,如果您正在运行Windows,则该过程会有所不同。如果您只编写Python,则不需要熟悉命令行,但是,如果您计划使用Django,或者一般运行动态网站,那么值得学习。
以下是安装Django所需的命令。它与Python 3不兼容,因此您需要安装2.7或更早版本才能使其运行。
wget http://www.djangoproject.com/download/1.3.1/tarball/
tar xzvf Django-1.3.1.tar.gz
cd Django-1.3.1
python setup.py install
接下来,我们可以选择删除安装文件。
cd ..
rm Django-1.3.1.tar.gz
应该这样做!我们来试试吧。
python
from django import get_version
get_version()
你应该看到'1.3.1'。如果你这样做,一切正常,Django安装在你的系统上。恭喜!我们准备开始创建我们的网站了!
建立我们的博客
我们今天要建立一个博客系统,因为它是学习基础知识的绝佳方式。首先,我们需要创建一个Django项目。
cd ~/Documents/Projects
django-admin.py startproject FirstBlog
cd FirstBlog
ls
每个这些文件做什么?
- __init__.py告诉Python这个文件夹是一个Python包。我们在第三课中了解了这些; 它允许Python将文件夹中的所有脚本作为模块导入。
- manage.py实际上并不是您网站的一部分; 它是一个从命令行运行的实用程序脚本。它包含一系列用于管理站点的功能。
- settings.py包含您网站的设置。Django不使用XML文件进行配置; 一切都是Python。此文件只是一些定义站点设置的变量。
- urls.py是将URL映射到页面的文件。例如,它可以将yourwebsite.com/about映射到“ 关于我们”页面。
Django称自己是一个MTV框架,代表模板模板视图。
应用
但是,这些文件中没有一个是自己创建的功能性网站。为此,我们需要应用程序。应用程序是您编写使您的网站运行的代码的地方,但在我们查看它们之前,我们需要了解Django的设计原则。
首先,Django是一个MVC框架,代表模型视图控制器。Django称自己是一个MTV框架,代表模板模板视图。这与MVC略有不同,但从根本上说,它们非常相似。无论如何,MVC是一种架构模式,它提供了一种构建项目的方法。它将用于处理数据的代码与管理用户界面的代码分开。
Django订阅DRY,或“不要重复自己”的理念。
其次,Django订阅了DRY,或者不重复自己的哲学,这意味着你永远不应该编写不止一次执行某项任务的代码。例如,在我们的博客中,如果我们编写了一个从存档中选择随机文章的功能,并在多个页面上实现了此功能,那么每次需要时我们都不会再对其进行编码。我们将其编码一次,然后在每个页面上使用它。
那么这与应用程序有何关系?那么,应用程序允许您以干燥的方式编写您的网站。每个项目(如我们这里的项目)都可以包含多个应用程序。相反,每个应用程序都可以是多个项目的一部分。使用前面的示例,这意味着如果我们将来创建另一个还需要随机页面功能的网站,我们就不必再将其全部写入。我们可以从这个项目中导入应用程序。因此,每个应用程序都有一个不同的用途,这一点非常重要。如果您在一个应用程序中编写了站点的所有功能,然后需要稍后再使用它的一部分,则必须全部导入。例如,如果您正在制作电子商务网站,则不希望导入所有博客功能。但是,如果您为随机功能创建一个应用程序,为博客发布系统创建一个应用程序,
这也意味着在站点内,代码组织得很好。如果要更改某个功能,则不必搜索一个大型文件; 您可以改为浏览相关应用并进行更改,而无需担心干扰其他任何内容。
python mangage.py startapp blog
cd blog
ls
同样,我们有一个__init__.py文件使它成为一个包,还有另外三个文件:模型,测试和视图。我们现在不需要担心测试,但其他两个很重要。模型和视图是M和VMVC的部分。
在模型中,我们定义了数据结构。
如果您曾经使用过PHP,那么您可能已经使用PhpMyAdmin来创建MySQL表,然后在PHP脚本中手动编写SQL查询。在Django中,它更容易。我们在这个模型文件中定义了我们需要的所有数据结构,然后运行一个命令,并为我们制作了所有必要的数据库。
当您希望访问该数据时,可以通过调用方法来访问这些模型,而不是运行原始查询。这非常有用,因为Django可以使用多个数据库程序。我们今天将使用MySQL,因为它是最强大的,并且是大多数主机提供的,但如果我们将来需要切换到不同的数据库,所有代码仍然有效!在其他语言中,如果要切换到SQLite或类似的东西,则需要重写访问数据库的代码。
在视图文件中,我们编写实际生成网页的代码。这将所有其他部分联系在一起。当用户键入URL时,它由urls我们之前看到的脚本发送到views脚本,脚本然后从模型中获取相关数据,处理它并将其传递到模板中,最终将其作为用户看到的页面提供。 。我们很快就会看一下这些模板。它们是最容易的部分 - 主要是HTML。
对于博客,我们需要一个帖子表,其中包含标题,正文,作者,写作时间等几个字段。一个真正的博客会有评论,但这超出了今天的演示范围。
from django.db import models
class posts(models.Model):
author = models.CharField(max_length = 30)
title = models.CharField(max_length = 100)
bodytext = models.TextField()
timestamp = models.DateTimeField()
MySQL的
这些模型只是一个描述。我们需要从中创建一个实际的数据库。首先,我们需要在我们的系统上运行MySQL。在实际的Web服务器上,这不是问题,因为它们通常会预先安装它。幸运的是,使用包管理器,它很容易安装。首先,您需要安装Homebrew和Easy Install
brew install mysql
easy_install mysql-python
mysqld_safe --skip-grant-tables #let anyone have full permissions
mysql -u root
UPDATE mysql.user SET Password=PASSWORD('nettuts') WHERE User='root'; #give the user 'root' a password
FLUSH PRIVILEGES;
mysql -u root -p #log in with our password 'nettuts'
CREATE DATABASE firstblog;
quit
python2.6 manage.py runserver
当您重新启动时,MySQL将不会运行,因此每次您需要在将来执行此操作时,请运行mysqld以启动服务器。然后python2.6 manange.py runserver,您可以在新选项卡中运行以启动开发服务器。
此命令不会运行服务器,它只会返回错误。那是因为我们需要配置我们的设置。我们来看看吧settings.py。
您需要先更改数据库设置。这些从第12行开始。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'firstblog', # Or path to database file if using sqlite3.
'USER': 'root', # Not used with sqlite3.
'PASSWORD': 'nettuts', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
如果您尝试再次运行服务器,它应该可以工作,只要您成功安装了MySQL。如果您127.0.0.1:8000在Web浏览器中访问,则应该会看到默认的Django页面。
现在让我们将我们的Django网站变成一个博客。首先,我们需要使用我们的模型通过运行以下命令在数据库中创建表:
python2.6 manage.py syncdb
每次更改模型时,都应运行此命令以更新数据库。请注意,这不能改变现有字段; 它可能只会添加新的。因此,如果要删除字段,则必须使用PhpMyAdmin等手动执行此操作。因为这是我们第一次运行该命令,所以Django将为管理系统之类的东西设置所有默认的内置表。只需输入“是”,然后填写您的详细信息。
现在让我们设置urls.py文件。取消注释示例部分中的第一行,并将其更改为say url(r'^$', 'FirstBlog.blog.views.home', name='home') 。
现在,让我们创建视图文件来响应这些请求。
from django.shortcuts import render_to_response
from blog.models import posts
def home(request):
return render_to_response('index.html')
模板
这个index.html文件还不存在,所以让我们来做吧。在blog应用程序中创建一个名为templates的文件夹,并在其中保存一个名为的文件index.html,暂时只能包含“Hello World”。然后,我们需要编辑设置文件,以便Django知道此模板的位置。
第105行是用于声明模板文件夹的部分的开始位置; 所以调整它,如下:
TEMPLATE_DIRS = (
"blog/templates",
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
如果再次运行服务器并在浏览器中刷新页面,则应该看到“Hello World”消息。我们现在可以开始布置我们的博客了。我们将为主页添加一些样板HTML。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="css/style.css">
<link href="images/favicon.ico" rel="shortcut icon">
<title>First Blog</title>
</head>
<body>
<div class="container">
<h1>First Blog</h1>
<h2>Title</h2>
<h3>Posted on date by author</h3>
<p>Body Text</p>
</div>
</body>
</html>
如果您保存并刷新页面,则应该看到该页面已使用此新内容进行了更新。下一步是从数据库添加动态内容。为了实现这一点,Django有一个模板语言,允许你用大括号嵌入变量。将页面的中间部分更改为如下所示:
<div class="container">
<h1>First Blog</h1>
<h2>{{ title }}</h2>
<h3>Posted on {{ date }} by {{ author }}</h3>
<p>{{ body }}</p>
</div>
然后,我们可以views.py通过创建值字典将值传递给文件中的这些变量占位符。
from django.shortcuts import render_to_response
from blog.models import posts
def home(request):
content = {
'title' : 'My First Post',
'author' : 'Giles',
'date' : '18th September 2011',
'body' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam cursus tempus dui, ut vulputate nisl eleifend eget. Aenean justo felis, dapibus quis vulputate at, porta et dolor. Praesent enim libero, malesuada nec vestibulum vitae, fermentum nec ligula. Etiam eget convallis turpis. Donec non sem justo.',
}
return render_to_response('index.html', content)
保存并刷新,您应该会看到您现在将内容传递到视图文件中的模板。最后一步是从我们的数据库中获取数据并将其传入。幸运的是,我们可以使用Django的模型在没有SQL查询的情况下完成所有操作。我们需要通过更改其他设置将我们的blog应用添加到FirstBlog项目中。转到INSTALLED_APPS第112行,然后添加
'FirstBlog.blog',
到列表。
然后更改,views.py以便从数据库中添加数据。
from django.shortcuts import render_to_response
from blog.models import posts
def home(request):
entries = posts.objects.all()[:10]
return render_to_response('index.html', {'posts' : entries})
接下来,更新模板以访问此数据。
<div class="container">
<h1>First Blog</h1>
<hr />
{% for post in posts %}
<div class="post">
<h2>{{ post.title }}</h2>
<h3>Posted on {{ post.timestamp }} by {{ post.author }}</h3>
<p>{{ post.bodytext }}</p>
</div>
<hr />
{% endfor %}
</div>
在这里,我们可以访问views.py文件中表格中的所有数据,然后只选择前十个条目。我们将这些数据传递到模板中,遍历条目并使用我们网站的HTML显示数据。这还不行,因为数据库中没有任何内容。停止服务器并运行:
python2.6 manage.py syncdb
这会将我们帖子的新表添加到数据库中。然后,打开一个新选项卡并键入:
mysql -u root -p
...输入您的密码,点击输入,然后执行:
INSERT INTO blog_posts (author, title, bodytext) values ('Bob', 'Hello World', 'Lorem Ipsum');
返回上一个选项卡并再次运行服务器。刷新页面,您应该看到一篇包含您刚刚添加的虚拟内容的博客文章。如果再多次运行MySQL命令,则刷新时应该会在页面上看到更多帖子。
Django的管理系统
我们今天需要做的最后一件事是审查Django的管理系统。这是Django的一个非常强大的功能,它允许您在不编写任何代码的情况下管理您的站点,就像您从头开始创建站点一样。要启用它,我们需要更改一些设置。首先,取消注释第4,5,13和16行urls.py,以便您可以实际访问管理页面。接下来,进入INSTALLED_APPS的部分settings.py并取消'django.contrib.admin',和'django.contrib.admindocs',。要让管理员控制您的posts表,请admin.py在该blog文件夹中创建一个新文件,并添加以下行:
from django.contrib import admin
from blog.models import posts
admin.site.register(posts)
python2.6 manage.py syncdb再次运行以添加管理部分的表,然后重新启动服务器。
如果您现在在浏览器中访问127.0.0.1:8000/admin,则应该会看到一个登录页面。使用您在第一次运行syncdb命令登录时先前选择的详细信息。您应该看到一个名为Blog的部分,其中包含该posts表的副标题。您可以使用它通过简单的界面创建,编辑和删除博客文章。
这就是要做的一切。您刚刚创建了一个功能齐全但功能简单的博客。为了完成本课,我们将着眼于在Web服务器上安装Django。
在Web服务器上安装
有两种类型的虚拟主机,你有哪些会影响你是否可以使用Django。如果您有共享托管,那么您完全受主办方的支配。
许多廉价的Web主机不支持Python。虽然PHP几乎可以保证,但对其他语言的支持通常不是。您必须检查控制面板以确定Python(和Django)是否可用。显然,每个主机的过程都略有不同。几乎所有托管都在Apache上运行,我们可以使用它来托管Django,使用mod_wsgi或者使用mod_pythonApache模块。
大多数Web主机使用CGI以多种语言运行脚本。Django可以在FastCGI上运行,理论上也可以在CGI上运行,但这不是官方支持的,对于实际的生产网站来说太慢了。您需要检查这些是否已安装。它们通常位于标题下,如“CGI和脚本语言支持”。
如果您有VPS托管,或者有幸拥有专用服务器,您的生活将更加轻松。通常这些都预装了Python,从那里,你只需要按照我们经历的相同步骤来获得运行Django的本地副本。如果您没有Python,可以使用包管理器安装它。你的系统甚至可能带有Django。
ssh root@example.com
wget http://www.djangoproject.com/download/1.3.1/tarball/
tar xzvf Django-1.3.1.tar.gz
cd Django-1.3.1
python setup.py install
在服务器上安装Django后,使用任何文件传输客户端上传刚刚创建的站点。您可以将文件放在任何位置,但将它们保留在public文件夹之外,或者任何人都可以看到您网站的源代码。我/home用于我的所有项目。
接下来,在服务器上创建一个名为“firstblog”的MySQL数据库,然后syncdb再次运行。您必须再次为管理员控制面板创建帐户,但这是一次性的事情。
如果您尝试运行此操作,则可能会收到错误,这是因为服务器的设置与本地计算机上的设置不同。您可能需要在其中更改数据库密码settings.py,但根据您的服务器配置,您可能还会遇到其他问题。在这些情况下,Google是您的朋友!
这次运行服务器,命令略有不同。您必须指定IP地址和端口,以便可以通过Internet访问该站点。
python manage.py runserver 0.0.0.0:8000
如果您在网络浏览器中访问您的网站,在端口8000上,您应该会看到您的网站!
与往常一样,我很乐意在评论中讨论有关本教程或Python的任何问题。谢谢阅读。