Django for beginner:用Django2.0部署最简单应用

in python •  7 years ago 

Chapter 3

本章学习日期: 2018年3月4日
章节学习地址:https://djangoforbeginners.com/pages-app/

本章学习内容:

本章介绍了如何创建并部署一个Pages应用,有一个主页和一个关于页面。此外,还要学习Django的基于类的视图(class-based views)和模板。

初步设置

首先仍然是创建Django项目,并创建pages应用。

$ cd ~/Desktop
$ mkdir pages
$ cd pages
$ pipenv install django
$ pipenv shell
(pages) $ django-admin startproject pages_project .
(pages) $ python manage.py startapp pages

pages应用添加进settings.py里。

# pages_project/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'pages',
]

模板

任何网络框架都需要一种方便的方式生成HTML文件。在Django中,这种方法就是使用模板,这样每个HTML文件都可以通过URL访问。

默认情况下,Django是项目中的每个应用内找模板,但是这样过于麻烦,本课程是创建一个项目级的文件夹templates,所有模板相关文件统一放置此处管理。

(pages) $ mkdir templates
(pages) $ touch templates/home.html

创建templates文件夹,并于此创建一个home.html

settings.py里,更新如下配置,告诉Django来此处寻找模板:

# pages_project/settings.py
TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]

home.html增加一个简单的标题行。

(html comment removed:  templates/home.html )
<h1>Homepage.</h1>

模板完成后,接着就是配置url和视图。

Class-Based Views

Django有两种视图,一种是Function-based views,另一种就是Class-Based Views。出于扩展和自定义的考虑,采用后者。

我们使用内置的TemplateView来展示模板。在pages/views.py文件中更新代码:

# pages/views.py

from django.views.generic import TemplateView


class HomePageView(TemplateView):
    template_name = 'home.html'

注意,视图是Python类,首字母大写。TemplateView已经包含了展示模板的所有逻辑。

URLs

最后一步是更新我们的URLConfs。首先,我们要更新项目级的urls.py文件,指向pages应用,然后在pages中匹配视图和路径。

更新项目级urls.py文件。

# pages_project/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns =[
    path('admin/', admin.site.urls),
    path('', include('pages.urls'),
]

然后创建一个应用级urls.py文件,添加下列代码:

#pages/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.HomePageView.as_view(), name='home'),
]

当我们使用Class-Based Views的时候,要使用as_view在最后。

执行python manage.py runserver,在http://127.0.0.1:8000/可以看到新的主页。
image

添加About页面

这一步与之前添加Home页面相似,同样是创建模板、新的视图和新的url路径。
在tempplates文件夹新增about.html页面,添加简短的HTML标题。

(html comment removed:  templates/about.html )
<h1>About page.</h1>

创建新的视图。

# pages/views.py
from django.views.generic import TemplateView

class HomePageView(TemplateView):
    template_name = 'home.html'
    
class AboutPageView(TemplateView):
    template_name = 'about.html'

将新的视图与about/的url连接。

# pages/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.HomePageView.as_view(), name='home'),
    path('about/', views.AboutPageView.as_view(), name='about'),
]

执行python manage.py runserver,打开http://127.0.0.1:8000/about ,就能看到新的“About页面”。
image

扩展模板

模板的真正力量是它的可扩展性。大多数网站上,都会存在每个页面上都重复展示的内容(header,footer等等)。在Django上就能实现。

templates文件夹创建一个base.html文件,包含指向两个页面的链接。

使用django内置的url tag添加链接。

(html comment removed:  templates/base.html )
<header>
    <a href="{% url 'home' %}">Home</a> | <a href="{% url 'about' %}">About</a>
</header>

{% block content %}
{% endblock %}

最后,更新home.htmlabout.html文件。

(html comment removed:  templates/home.html )
{% extends 'base.html' %}

{% block content %}
<h1>Homepage.</h1>
{% endblock %}
(html comment removed:  templates/about.html )
{% extends 'base.html' %}

{% block content %}
<h1>About page.</h1>
{% endblock %}

大功告成!

测试

最后,我们来到了测试环节。即便是一个非常基础的应用,测试也是非常重要的。

pages应用的tests.py文件中,添加代码:

# pages/tests.py
from django.test import SimpleTestCase

class PagesTests(SimpleTestCase):
    def test_home_page_status_code(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)
    
    def test_about_page_status_code(self):
        response = self.client.get('/about/')
        self.asertEqual(response.status_code, 200)

因为没有使用数据库,所以只用了SimpleTestCase,如果用了数据库,可以使用TestCase
执行python manage.py test

(pages) $ python manage.py test
Creating test database for alias 'default'...
..
----------------------------------------------------------------------
Ran 2 tests in 0.028s

OK
Destroying test database for alias 'default'...

Git和Bitbucket

版本控制在上一章已经讲述,这里只贴一下代码,加深印象,不多赘述。

(pages) $ git init
(pages) $ git status
(pages) $ git add -A
(pages) $ git commit -m 'initial commit'
(pages) $ git remote add origin [email protected]:wsvincent/pages-app.git
(pages) $ git push -u origin master

记得将远程地址替换成自己的。

本地环境 VS 生产环境

直到目前为止,我们用Django做的都是本地的网站,没有上传到服务器上,其他人没法看到。

若要让网站在互联网上可见,就需要将代码部署到外部服务器上,也就是将代码放置在生产环境。

作者推荐了一个Heroku的服务器提供商。

感兴趣的同学可自行研究一番。

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!