Python

Django安装

安装Django

  • pip3 install django

测试你的安装

>>> import django
>>> print(django.get_version())
1.10

创建你的Django项目

  • django-admin.py startproject mysite

  这个命令竟会运行django-admin.py脚本,它将会为你创建一个名叫mysite的Django新项目.这个名字随便你取的.
  在你新创建的mysite项目里自动创建了两个项目:

  • 一个和mysite同名的目录.
  • 一个叫manage.py的Python脚本

   以下为这几个脚本的用途:

  • __init__.py:这是一个空的脚本,用来告诉Python编译器这个目录是一个Python包.
  • settings.py:用来存储Django项目设置的文件.
  • urls.py:用来存储项目里的URL模式.
  • wsgi.py:用来帮助你运行开发服务,同时可以帮助部署你的生产环境.

   在项目里还有一个叫做manage.py的文件.这个文件是我们开发项目时经常使用的文件,它为我们提供了一系列的Django命令.例如,manage.py允许你运行内建的Django服务来测试和运行数据库命令.真的,这个脚本是你最常用的脚本了.

启动你的项目

   运行manage.py脚本,启动项目

[root@yang ]# python3 manage.py runserver 0.0.0.0:8000
Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
August 29, 2016 - 15:51:27
Django version 1.10, using settings 'Djanjo.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

检查启动

[root@yang ]# python3 manage.py  migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK

  migrate命令会检查你的INSTALLED_APPS设置,同时会创建你的mysite/settings.py文件中相关的app的数据库图表(我们稍后会介绍).你将会看到所有初始化的信息.
  现在你就可以通过浏览器直接访问了 http://127.0.0.1:/8000

创建Django应用

__1). __ 通过一系列的设置和各种应用就可以组成一个web应用和网站,每个Django应用的存在都对应它实现的一种功能.针对不同的功能你需要创建不同的应用.

[root@yang-200-87 /home/yang/mysite]# python3 manage.py startapp rango

  这个命令在你的项目根目录里创建了一个新的名叫rango的目录 - 这里面包含了5个Python脚本:

  • __init__.py,这是一个空的脚本,用来告诉Python编译器这个目录是一个Python包.
  • models.py,一个存储你的应用中数据模型的地方 - 在这里描述数据的实体和关系.
  • tests.py,存储你应用的测试代码.
  • views.py,在这里处理用户请求和响应.
  • admin.py,在这里你可以向Django注册你的模型,它会为你创建Django的管理界面.

  views.py和models.py在每个应用中都要用到,他们俩是Django设计模式的组成部分,例如Model-View-Template模式.

__2). __ 在你创建模型和视图之前,你必须要告诉Django你的新应用的存在.所以你必须修改你配置目录里的settings.py文件.打开文件找到INSTALLED_APPS元组.在元祖的最后面增加rango:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rango',
]

__3). __ 既然我们已经创建好Rango,让我们创建一个简单的视图.作为我们的第一个视图,我们就简单的把文本传送给客户端 - 我们现在不必关心模型或者模板:

 from django.shortcuts import render
from django.http import HttpResponse

def test(request):
        return HttpResponse('This is my first Django page!')
  • 我们第一行首先从django.http模块导入HttpResponse对象.
  • 在views.py文件里每个视图对应一个单独的函数.在这个例子中我们只创建了一个test视图.
  • 每个视图至少带一个参数 - 一个在django.http模块的HttpRequest对象.
  • 每个视图都要返回一个HttpResponse对象.本例中这个HttpResponse对象把一个字符串当做参数传递给客户端.

URL映射

__1). __ 在rango目录里,我们需要创建一个叫做urls.py的文件.文件里是可以设置你的应用映射到URL:

from django.conf.urls import  url
from rango import views


urlpatterns = [
        url(r'test', views.test, name='test'),
]

__2). __ 打开项目目录中的 urls.py文件,添加映射:

from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import include

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^rango/', include('rango.urls')),
]

  新增的映射将会寻找匹配^rango/的url字符串.如果匹配成功的话将会传递给rango.urls(我们已经设置过了).include()函数是从django.conf.urls导入的.整个URL字符串处理过程如下图所示.在这个过程中,域名首先被提取出来然后留下其他的url字符串(rango/)传递给我们的tango_with_django_project,在这里它会匹配并去掉rango/然后把空字符串传递给rango应用.Rango现在匹配一个空字符串,它会返回我们创造的test()视图.

使用模板

__1). __ 设置模板目录

  为了建立和启动模板,你需要设置一个储存模板的目录.
  在你的Django项目目录(mysite)里,创建一个新的目录叫做templates.在这个目录里创建另一个rango目录.所以我们将在mysite/templates/rango/目录里存放关于rango应用的模板.
  为了告诉Django我们的模板在哪里,我们需要修改项目的settings.py文件.找到TEMPLATE_DIRS并把创建的templates目录路径加入到里面:

TEMPLATE_PATH = os.path.join(BASE_DIR,'templates')

TEMPLATE_DIRS = [
        TEMPLATE_PATH,
]
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': TEMPLATE_DIRS,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

__2). __ 添加模板
  在我们创建模板目录和设置好路径以后,我们需要在template/rango/目录里建立一个叫做index.html的文件,在新文件里加入下面代码:

<!DOCTYPE html>
<html>

    <head>
        <title>Rango</title>
    </head>

    <body>
        <h1>Rango says...</h1>
        hello world! <strong>{{ boldmessage }}</strong><br />
        <a href="/rango/about/">About</a><br />
    </body>

</html>

  这个HTML代码创建一个问候用户的简单HTML页面.你可能注意到了在上面有一段非HTML代码{{boldmessage}}.这是Django模板的变量,他可以在输出时为这个变量赋值.一会我们就会用它.
  为了使用这个模板,我们需要在rango/views.py里添加如下代码:

def index(request):
    context_dict = {'boldmessage':"i am bold font form the context"}
    return render(request,'rango/index.html', context_dict)

   为此模板添加URL映射:

urlpatterns = [
    url(r'yang', views.yang, name='yang'),
    url(r'index', views.index, name='index'),
]

   首先我们建立一个在模板中使用的字典,然后我们调取render()函数.这个函数接受用户的request,模板名称和内容字典作为参数.这个render()函数将会把这些参数聚合到一起生成一个完整的HTML页面.然后返回给用户的浏览器.
   当模板文件被加载到Django模板系统里时,它模板内容也会被创建.在简单的例子里模板的内容是字典里的模板变量对应的Python变量.在我们早先创建的模板文件,我们创建了一个叫做boldmessage的模板变量.在index(request)视图例子中,字符串I am bold font from the context映射到模板变量boldmessage.所以字符串I am bold font from the context将会替换模板里所有的{{ boldmessage }}.

__3). __ 使用静态媒体

   为了增加样式和引入动态行为我们可以在我们的网站里加入CSS,Javascript和图像这些静态媒体.这些文件和网页有一些不同.这是因为它们不想HTML页面是生成出来的.

3.1). 设置静态媒体目录
    为了设置静态媒体,你需要设立存储它们的目录.在你的项目目录,创建叫做static的目录.在static里再创建一个images目录. 并在statec/images目录里放一张图片123.jpg
   我们需要告诉Django我们创建了static目录.在settings.py文件,我们需要更新两个变量STATIC_URL和STATICFILES_DIRS元组,像下面一样创建一个储存静态目录(STATIC_PATH)的变量:

STATIC_URL = '/static/'

STATIC_PATH = os.path.join(BASE_DIR,'static')

STATICFILES_DIRS = (
    STATIC_PATH,
)
  • 第一个变量STATIC_URL定义了当Django运行时Django应用寻找静态媒体的地址.例如,像我们上面的代码一样吧STATIC_URL设置成/static/,我们就可以通过http://127.0.0.1:8000/static/来访问它了.

  • STATIC_URL定义了web服务链接媒体的URL地址,STATICFILES_DIRS允许你定义新的static目录.像TEMPLATE_DIRS元组一样.STATICFILES_DIRS需要static目录的绝对路径.这里,我们重新用5.1章的BASE_DIR变量来创建STATIC_PATH.

  • 完成了这两个设置后,再一次运行你的Django服务.如果我们想要查看我们的Rango图片,访问http://127.0.0.1:8000/static/images/123.jpg.

  __3.2). __ 现在你已经为你的Django项目设置了静态媒体,你可以在你的模板里加入这些媒体.
   修改HTML源码,加入文件引用:

<!DOCTYPE html>
{% load staticfiles %} 
<!-- New line -->

<html>

    <head>
        <title>Rango</title>
    </head>

    <body>
        <h1>Rango says...</h1>
        hello world! <strong>{{ boldmessage }}</strong><br />
        <a href="/rango/about/">About</a><br />
        <img src="{% static "images/rango.jpg" %}" alt="Picture of Rango" /> <!-- New line -->
    </body>

</html>

  首先,我们需要使用{% load static %}标签来使用静态媒体.所以我们才可以用{% static "rango.jpg" %在模板里调用static文件.Django模板标签用{ }来表示.在这个例子里我们用static标签,它将会把STATIC_URL和123.jpg连接起来,如下所示:

<!DOCTYPE html>
{% load static %}
<html>

    <head>
        <title>Rango</title>
    </head>

    <body>
        <h1 class="c1">Rango says...</h1>
        hello world! <strong>{{ boldmessage }}</strong><br />
        <a href="/rango/yang/">About</a><br />
        <img src = "{%  static "images/123.jpg" %}" alt="Picture of Rango" />
    </body>

</html>

  当你希望在模板里使用静态媒体你需要调用{% static %}函数.下面的代码将展示给你如何在你的模板里添加Javascript,CSS和图片:

<!DOCTYPE html>
{% load static %}
<html>

    <head>
        <title>Rango</title>
                <link rel="stylesheet" href="{% static "css/base.css" %}" /> <!-- CSS -->
        <script src="{% static "js/jquery.js" %}"></script> <!-- JavaScript -->
    </head>

    <body>
        <h1 class="c1">Rango says...</h1>
        hello world! <strong>{{ boldmessage }}</strong><br />
        <a href="/rango/yang/">About</a><br />
        <img src = "{%  static "images/123.jpg" %}" alt="Picture of Rango" />
    </body>

</html>

模型和数据库

   通常来说处理数据库需要我们掌握许多复杂的SQL语句.但是在Django里,对象关系映射(ORM)帮我们处理这一切,包括通过模型创建数据库表.事实上,模型是描述你的数据模型/图表的一个Python对象.与以往通过SQL操作数据库不同,你只用使用Python对象就能操作数据库.在本章,我们将会学习如何设立数据库并为Rango建立模型.

__1). __ 告诉 Django 你的数据库

   在你创造任何模型之前都要对你的数据库进行设置.在Django1.7,当你创建了一个项目,Django会自动在settings.py里添加一个叫做DATABASES的字典.它包含如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

__2). __ 创建模型

   在rango/models.py里,我们定义两个继承自djnago.db.models.Model的类.这两个类分别定义目录和页面.定义Category和Page如下:

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=128,unique=True)

    def __unicode__(self):
        return self.name


class Page(models.Model):
    category = models.ForeignKey(Category)
    title = models.CharField(max_length=128)
    url = models.URLField()
    views = models.IntegerField(default=0)

    def __unicode__(self):     
        return self.title

   当你定义了一个模型,你需要制定可选参数的属性以及相关的类型列表.Django提供了许多内建字段.一些常用的如下:

  • CharField,存储字符数据的字段(例如字符串).max_length提供了最大长度.
  • URLField,和CharField一样,但是它存储资源的URL.你也可以使用max_length参数.
  • 'IntegerField',存储整数.
  • DateField,存储Python的datetime.date.

   Django也提供了连接模型/表的简单机制.这个机制封装在3个字段里,如下:

  • ForeignKey, 创建1对多关系的字段类型.
  • OneToOneField,定义一个严格的1对1关系字段类型.
  • ManyToManyFeild,当以多对多关系字段类型.

__3.) __ 创建和迁移数据库

   我们定义了模型,那么Django就能很好的自动创建我们的数据库.

python3 manage.py migrate

   当你更改模型的时候,你需要通过makemigrations进行修改,所以对于rango,我们需要:

python3 manage.py makemigrations rango

__4.) __ Django模型和Django Shell

   在我们把注意力集中到Django管理界面之前,通过Django shell创建Django模型也是值得一试的 - 它对我们debug非常有用.下面我们将展示如何用这种方式来创建Category实例.
   为了得到shell我们需要再一次调用Django项目根目录里的manage.py.

python3 manage.py shell

   这个实例将会创建一个Python解析器并且载入你的项目的设置.你可以和模型进行交互.下面的命令展示了这一功能.注释里可以看到每个命令的功能:

原文地址:https://www.cnblogs.com/postgres/p/5829529.html