django2.0初步认识

django2.0 release版本最近已经正式上线,据说和django1有比较大的差别。

一、django概要认识

python的web开发框架很多,django算是其中比较有名的。
自称是“能够很好地应对应用上线期限的Web框架”。——所以应该是一个在开发效率上很快的框架? 发布于21世纪初,由一个报业的在线业务的Web开发者创建,2005年正式发布。

二、如何安装django?

使用pip3 install django即可安装

三、如何安装使用virtualenv?

virtualenv是用来为一个应用创建一套“隔离”的Python运行环境的组件。

安装virtualenv: pip3 install virtualenv

使用virtualenv:

创建项目目录,如:mkdir myproject 在项目内创建独立的python运行环境,如:virtualenv --no-site-packages myvenv 命令virtualenv就可以创建一个独立的Python运行环境,我们还加上了参数--no-site-packages,这样,已经安装到系统Python环境中的所有第三方包都不会复制过来,这样,我们就得到了一个不带任何第三方包的“干净”的Python运行环境。

进入创建的python运行环境source myvenv/bin/activate 注意到命令提示符变了,有个(venv)前缀,表示当前环境是一个名为venv的Python环境。

之后可以在当前环境下安装所需的各种第三方包。 在venv环境下,用pip安装的包都被安装到venv这个环境下,系统Python环境不受任何影响。也就是说,venv环境是专门针对myproject这个应用创建的。

退出当前的venv环境,直接使用deactivate命令:deactivate

virtualenv创建运行环境的原理: virtualenv是如何创建“独立”的Python运行环境的呢?原理很简单,就是把系统Python复制一份到virtualenv的环境,用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。

四、如何使用django创建一个项目?

创建项目:
django-admin startproject mysite

创建项目内不同的app模块,比如创建blog模块:
./manage.py startapp blog

五、django目录解析

项目目录:
文件名 | 描述/用途
---|---
manage.py | 应用的命令行接口
mysite | 项目主app模块
db.sqlite3 | 如果使用的是sqlite数据库,则会有此文件存在,这是sqlite数据库文件
app | 如果执行了./manage.py startapp app之后,则会在项目目录底下创建相应的app模块文件夹

主app模块目录:
文件名 | 描述/用途
---------|---------------
__init__.py | 告诉python这是一个软件包
settings.py | 项目相关配置
urls.py | 全局URL配置(“URLconf”)
wsgi.py | wsgi服务器配置文件

自建app模块目录:
文件名 | 描述/用途
---|---
__init__.py | 告诉python这是一个软件包
apps.py | app模块配置
urls.py | 应用的URL配置文件(“URLconf”),这个文件并不像项目的URLconf那样自动创建。
models.py | 数据模型
urls.py | 全局URL配置(“URLconf”)
views.py | 视图函数文件(MVC中的控制器)
tests.py | 单元测试
templates | 模板文件夹,需手动创建,应用不会自动创建

六、django如何访问数据库?如何对象持久化?

数据模型类需应用model。

Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码.

django.db.models.Model会根据数据模型里定义的属性来自动映射数据库相应字段栏位。

数据模型的Objects属性是模型的Manager类,其中含有all()等方法来获取QuerySet。

QuerySet API是django的数据库相关接口,可以认为QuerySet是数据库中的每行数据。但其实QuerySet不是真实的每行数据,因为QuerySet执行“惰性迭代”。
只有在求值时才会真正查询数据库。换句话说,QuerySet可以进行任何操作,但并没有接触到数据。

七、django网页访问原理,如何处理网页请求?

Django是自底向上处理请求,它首先查找匹配的URL模式,接着调用对应的视图函数,最后将渲染好的数据通过模板展现给用户。

八、django开发流程

1. 创建项目

首先,使用virtualenv,进入python开发环境,执行以下命令创建项目: django-admin startproject mysite

2. 修改settings.py参数

创建mysite项目之后,到mysite/mysite/settings.py里配置数据库连接参数

同时在settings.py里修改i18n参数LANGUAGE_CODE为支持中文的参数: LANGUAGE_CODE = 'zh-Hans'

修改获取时间时所采用的时区参数TIME_ZONE: TIME_ZONE = 'Asia/Shanghai'

3. 创建app模块

在mysite根目录下,执行以下命令创建app模块(类似java的struts里创建action类): ./manage.py startapp blog

其中blog是app模块名,创建app模块之后,在mysite根目录下会自动创建一个blog的文件目录,里面包含有blog模块的相关文件。

4. 创建数据模型(models)

在mysite/blog/models.py里创建数据模型,如:

from django.db import models  
from django import forms  
from django.utils.translation import gettext_lazy as _

# Create your models here.
class BlogPost(models.Model):  
    title = models.CharField(max_length=150)
    body = models.TextField()
    timestamp = models.DateTimeField()

    class Meta():
        ordering = ('-timestamp',)

class BlogPostForm(forms.ModelForm):  
    class Meta():
        model = BlogPost
        exclude = ('timestamp',)
        fields = ('title', 'body', 'timestamp')
        labels = {
            'title': _('标题'),
            'body': _('内容'),
        }
        widgets = {
            'body': forms.Textarea(attrs={'cols': 60, 'rows': 3}),
        }
5. 将数据模型同步应用到数据库

每当有数据模型增加或修改之后,需要执行makemigrations命令来将模型修改打包成迁移文件,如: ./manage.py makemigrations

然后还需要执行migrate来把修改应用到数据库,如: ./manage.py migrate

6. 添加视图(views)访问逻辑

在mysite/blog/views.py里添加视图访问逻辑,如:

from datetime import datetime  
from blog.models import BlogPost, BlogPostForm  
from django.views.generic.base import TemplateView, RedirectView

# Create your views here.
class ArchiveView(TemplateView):  
    template_name = "archive.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['posts'] = BlogPost.objects.all()[:10]
        context['form'] = BlogPostForm()
        return context

class CreateBlogPostView(RedirectView):  
    def get_redirect_url(self, *args, **kwargs):
        request = self.request
        if request.method.lower() == 'post':
            form = BlogPostForm(request.POST)
            if form.is_valid():
                post = form.save(commit=False)
                post.timestamp=datetime.now()
                post.save()

        return super().get_redirect_url(*args, **kwargs)
7. 添加模板显示文件

在mysite/blog/templates/里添加模板文件,如:

<!--archive.html-->  
{% extends "base.html" %}
{% block content %}
    {% for post in posts %}
        <h2>{{ post.title }}</h2>
        <p>{{ post.timestamp }}</p>
        <p>{{ post.body }}</p>
    <hr>
    {% endfor %}
{% endblock %}
8. 添加url配置

在mysite/blog/urls.py里添加url配置,如:

from django.urls import path  
from blog.views import ArchiveView, CreateBlogPostView


urlpatterns = [  
    path('blog/', ArchiveView.as_view(), name="archive"),
    path('blog/create', CreateBlogPostView.as_view(url="/blog/"), name='archive-create'),
]
9.启动项目

最后在mysite项目根目录下执行命令启动项目: ./manage.py runserver

访问http://localhost:8000/blog即可。

Wilson

张弛有度、简约不简单