django简介

本文主要介绍了Django

hello world

python manage.py startproject

projects vs apps
What’s the difference between a project and an app? An app is a Web application that does something – e.g., a Weblog system, a database of public records or a simple poll app. A project is a collection of configuration and apps for a particular website. A project can contain multiple apps. An app can be in multiple projects.

python manage.py startapp polls

views

urls.py类似于struts中action的配置,在web.xml/struts.xml中配置action

database

python manage.py migrate

models

MVC的model层
app的model中增加model
在setting中,将新写的模块/app注册
迁移:执行python manage.py makemigrations polls,这一步只形成操作数据库的SQL
查看:对应的sql:python manage.py sqlmigrate polls 0001 可以查看
执行迁移:python manage.py migrate,就是执行sql

python manage.py shell

这个真是奇特的体验,可以对数据库进行操作,而操作的语句又是对python对象进行操作,不是直接执行sql。

```python
from polls.models import Question, Choice
Question.objects.all()

# 增
q = Question(question_text="What's new?", pub_date=timezone.now())
q.save()

# 查
Question.objects.filter(id=1)

from django.utils import timezone
current_year = timezone.now().year
Question.objects.get(pub_date__year=current_year)
q = Question.objects.get(id=1)
q.was_published_recently()

# 关系映射
# 注意只是choice上外键,而question并没有choice_set对象,实现自动添加的
q.choice_set.create(choice_text='Not much', votes=0)
c = q.choice_set.create(choice_text='Just hacking again', votes=0)
c.question
q.choice_set.all()

# 删除
c = q.choice_set.filter(choice_text__startswith='Just hacking')
c.delete
```

admin

admin应该类似与control层

创建超级用户:python manage.py createsuperuser,可以通过超级用户登录

启动服务:python manage.py runserver

登录:http://127.0.0.1:8000/admin/

在admin注册app:

polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)

more views

project --> app
view --> url
model --> admin
对model操作现在是通过admin,应该也可以通过view

templates

由于view显示太单一,用template来调和
templates就是将显示与python分开,显示部分交给templates中的页面,而view可以传入数据。
The render() function takes the request object as its first argument, a template name as its second argument and a dictionary as its optional third argument. It returns an HttpResponse object of the given template rendered with the given context.
return render(request, 'polls/detail.html', {'question': question})

url
在template的html中,可以通过href中使用

{% url %}

来引上已有的url对应的view

url的命名空间

app_name = polls

forms

hese views represent a common case of basic Web development:getting data from the database according to a parameter passed in the URL, loading a template and returning the rendered template

Generic Views

We’re using two generic views here: ListView and DetailView. Respectively, those two views abstract the concepts of “display a list of objects” and “display a detail page for a particular type of object.”

默认调用与指定模板名字调用

By default, the DetailView generic view uses a template called<app name>/<model name>_detail.html. In our case, it would use the template "polls/question_detail.html". The template_name attribute is used to tell Django to use a specific template name instead of the autogenerated default template name. We also specify the template_name for the results list view

test

执行测试:python manage.py test polls
测试过程描述:

  • python manage.py test polls looked for tests in the polls application
  • it found a subclass of the django.test.TestCase class
  • it created a special database for the purpose of testing
  • it looked for test methods - ones whose names begin with test
  • in test_was_published_recently_with_future_question it created a Question instance whose pub_date field is 30 days in the future
  • and using the assertIs() method, it discovered that its was_published_recently() returns True, though we wanted it to return False

static file

静态文件定义:
Aside from the HTML generated by the server, web applications generally need to serve additional files — such as images, JavaScript, or CSS.In Django, we refer to these files as “static files”.

django.contrib.staticfiles模块
That’s what django.contrib.staticfiles is for: it collects static files from each of your applications (and any other places you specify) into a single location that can easily be served in production.

配置:
css文件放置位置与template文件类似,不再赘言
html引入时:

 {% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />

注意需要重启服务,才可以见效。

admin

admin.py用来定制后台也就是http://127.0.0.1:8000/admin的显示

model的显示

from .models import Question,Choice

#class ChoiceInline(admin.StackedInline):
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 2

class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date', 'question_text']
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
inlines = [ChoiceInline]

list_display = ('question_text', 'pub_date', 'was_published_recently')

# 这里增加过滤
list_filter = ['pub_date']

# 这里增加搜索条
search_fields = ['question_text']

admin.site.register(Question, QuestionAdmin)

模板

可以从通过修改base_site.html(从django包里拷出来放到templates下)来实现对后台的修改。同样适用于index.html

reuseable apps

  1. 重新建立一个文件夹,将polls整个拷贝进入
  2. 写各种文件
    包括readme.rst\licenst
    创建docs文件夹用来写文档
  3. setup.py
import os
from setuptools import find_packages, setup

with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme:
    README = readme.read()

# allow setup.py to be run from any path
os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))

setup(
    name='django-polls',
    version='0.1',
    packages=find_packages(),
    include_package_data=True,
    license='BSD License',  # example license
    description='A simple Django app to conduct Web-based polls.',
    long_description=README,
    url='https://www.example.com/',
    author='Your Name',
    author_email='yourname@example.com',
    classifiers=[
    'Environment :: Web Environment',
    'Framework :: Django',
    'Framework :: Django :: X.Y',  # replace "X.Y" as appropriate
    'Intended Audience :: Developers',
    'License :: OSI Approved :: BSD License',  # example license
    'Operating System :: OS Independent',
    'Programming Language :: Python',
    'Programming Language :: Python :: 3.5',
    'Programming Language :: Python :: 3.6',
    'Topic :: Internet :: WWW/HTTP',
    'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
    ],
)
  1. MANIFEST.in
 include LICENSE
 include README.rst
 recursive-include polls/static *
 recursive-include polls/templates *
 recursive-include docs *
  1. 执行命令
    python setup.py sdist :his creates a directory called dist and builds your new package, django-polls-0.1.tar.gz

  2. 安装/卸载

    pip install --user django-polls/dist/django-polls-0.1.tar.gz

    pip uninstall django-polls

模板

模板语言

  • 变量
    变量看起来就像是这样: {{ variable }} . 当模版引擎遇到一个变量,它将计算
    这个变量,然后用结果替换掉它本身
    使用点 ( . ) 来访问变量的属性

  • 标签
    标签在渲染的过程中提供任意的逻辑
    一个标签可以输出内容,作为控制结构,例如“if”语句或“for”循环从数据库中提取内容,甚至可以访问其他的模板标签

for
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>

if  ,  elif  , and  else
{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

extends 与 block:见下模板继承

  • 过滤器

    可以通过使用 过滤器来改变变量的显示。

    过滤器看起来是这样的: {{ name|lower }} 。这将在变量 {{ name }} 被过滤器lower 过滤后再显示它的值,该过滤器将文本转换成小写。使用管道符号( | )来应用过滤器。过滤器能够被“串联”。一个过滤器的输出将被应用到下一个。

  • 注释
    要注释模版中一行的部分内容,使用注释语法 {# #}

  • 模板继承
    base.xml
    实现.xml
    就是用block 的内容去替换原来的base.xml的位置

  • 其他
    在Python中使用模板系统有三个步骤:

    1. 配置 引擎 。
    2. 将模板代码编译成 模板。
    3. 根据 上下文 渲染模板。

表单

表单

一个表单必须指定两样东西:
where:响应用户输入的URL
how:HTTP 方法

在Django 中渲染一个对象时,我们通常:

  1. 在视图中获得它(例如,从数据库中获取)
  2. 将它传递给模板上下文
  3. 使用模板变量将它扩展为HTML 标记

why

绑定的和未绑定的表单实例
绑定的和未绑定的表单 之间的区别非常重要:
未绑定的表单没有关联的数据。当渲染给用户时,它将为空或包含默认的值。
绑定的表单具有提交的数据,因此可以用来检验数据是否合法。如果渲染一个 不合法的绑定的表单,它将包含内联的错误信息,告诉用户如何纠正数据。

how

例如:我们可以用它来在一个个人网站上实现“联系我”功能

#forms.py
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)

每个表单字段都有一个对应的 Widget 类,它对应一个HTML 表单 Widget ,例
<input type="text">

#views.py
from django.core.mail import send_mail
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']
recipients = ['info@example.com']
if cc_myself:
recipients.append(sender)
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect('/thanks/')

不管表单提交的是什么数据,一旦通过调用 is_valid() 成功验证
( is_valid() 返回 True ),验证后的表单数据将位于 form.cleaned_data
字典中。这些数据已经为你转换好为Python 的类型。

#name.xml
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit" />
</form>

你需要做的就是将表单实例放进模板的上下文。如果你的表单在 Contex t 中叫
做 form ,那么 {
} 将正确地渲染它的<label><input> 元素。

总结:
通过view将form渲染到template上,生成表单?

开发过程

设置

设置文件可以通过DJANGO_SETTINGS_MODULE来指定

bash

export DJANGO_SETTINGS_MODULE=mysite.settings

django-admin runserver

windows

set DJANGO_SETTINGS_MODULE=mysite.settings

django-admin runserver

手工设置

django-admin runserver --settings=mysite.settings

在服务器上(mod_wsgi)

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

配置应用

要配置一个应用,请子类化 AppConfig 并将这个子类的路径放
在 INSTALLED_APPS 中。
当 INSTALLED_APPS 包含一个应用模块的路径后,Django 将在这个模块中检查一
个 default_app_config 变量

from django.apps import AppConfig
class RockNRollConfig(AppConfig):
name = 'rock_n_roll'
verbose_name = "Rock ’n’ roll"

异常

Django核心异常类定义在 django.core.exceptions

ObjectDoesNotExist

FieldDoesNotExist

MultipleObjectsReturned

SuspiciousOperation:当用户进行的操作在安全方面可疑的时候,抛出

SuspiciousOperation 异常,例如篡改会话cookei

PermissionDenied: 当用户不被允许来执行请求的操作时产生

ViewDoesNotExits

MiddlewareNotUsed

ValidationError:当表单或模型字段验证失败时抛出 ValidationError 异常

URL解析器异常

URL解析器异常定义在 django.core.urlresolvers

测试

Django的单元测试使用的是Python标准库: unittest 。该模块是采用基于类的
测试

测试工具的默认操作是寻找所有的测试用例(即 unittest. 的子类TestCase)在名称以 test 开头的任何文件中,自动从这些测试用例构建测试套件,并运行该套件(运行以test开头的函数)。

运行:

# Run all the tests in the animals.tests module
$ ./manage.py test animals.tests
# Run all the tests found within the 'animals' package
$ ./manage.py test animals
# Run just one test case
$ ./manage.py test animals.tests.AnimalTestCase
# Run just one test method
$ ./manage.py test animals.tests.AnimalTestCase.test_animals_can_speak

客户端测试

from django.test import Client
>>> c = Client()
>>> response = c.post('/login/', {'username': 'john', 'password'
: 'smith'})
>>> response.status_code
200
>>> response = c.get('/customer/details/')
>>> response.content
'<!DOCTYPE html...'

WSGI部署

易于部署就是一个主要的目标。有许多优秀的方法可以轻松地来部署Django:
如何使用WSGI 部署
部署的检查清单

Django 首要的部署平台是WSGI,它是Python Web 服务器和应用的标准
Django 的 startproject 管理命名为你设置一个简单的默认WSGI 配置。

  • application对象
    使用WSGI 部署的核心概览是 application 可调用对象,应用服务器使用它来与
    你的代码进行交换。在Python 模块中,它通常一个名为 application 的对象提
    供给服务器使用。
    startproject 命令创建一个 <project_name>/wsgi.py 文件,它就包含这样
    一个 application 可调用对象。
    它既可用于Django 的开发服务器,也可以用于线上WSGI 的部署。
    WSGI 服务器从它们的配置中获得 application 可调用对象的路径。Django 内
    建的服务器,叫做 runserver 和 runfcgi 命令,是从 WSGI_APPLICATION 设
    置中读取它。默认情况下,它设置为 <project_name>.wsgi.application ,指
    <project_name>/wsgi.py 中的 application 可调用对象。

  • setting模块
    当WSGI 服务器加载你的应用时,Django 需要导入settings 模块 —— 这里是你的
    全部应用定义的地方。
    Django 使用 DJANGO_SETTINGS_MODULE 环境变量来定位settings 模块。它包含
    settings 模块的路径,以点分法表示。对于开发环境和线上环境,你可以使用不同
    的值;这完全取决于你如何组织你的settings。

  • 运用中间件
    你可以简单地封装application 对象来运用 WSGI 中间件。 例如,你可以
    在 wsgi.py 的底下添加以下这些行:
    from helloworld.wsgi import HelloWorldApplication
    application = HelloWorldApplication(application)
    如果你结合使用 Django 的application 与另外一个WSGI application 框架,你还可
    以替换Django WSGI 的application 为一个自定义的WSGI application

admin

  1. 添加 'django.contrib.admin' 到 INSTALLED_APPS 设置中.

  2. admin有四个依赖 - django.contrib.auth,
    django.contrib.contenttypes , django.contrib.messages
    和 django.contrib.sessions . 如果这些应用没有在 INSTALLED_APPS 列
    表中, 那你要把它们添加到该列表中.

    1. 把 django.contrib.messages.context_processors.messages 添加
      到 TEMPLATES 中 DjangoTemplates 后台的 'context_processors' 选项
      中,同样
      把 django.contrib.auth.middleware.AuthenticationMiddleware 和
      django.contrib.messages.middleware.MessageMiddleware 添加到
      MIDDLEWARE_CLASSES . (这些默认都是激活的,所以如果你手工操作过的话
      就需要按照以上方法进行设置..)
  3. 确定应用中的哪些模型应该在Admin 界面中可以编辑。

  4. 给每个模型创建一个 ModelAdmin 类,封装模型自定义的Admin 功能和选
    项。

  5. 实例化 AdminSite 并且告诉它你的每一个模块和 ModelAdmin 类.

  6. 将 AdminSite 实例绑定到URLconf。

# python 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×