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

in #python7 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的服务器提供商。

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

Sort:  

新年快乐!请接受cn区点赞机器人 @cnbuddy 对你作为cn区一员的感谢。假如我的留言打扰到你,请回复“取消”。