Loading

django基础之Django简介

网站运行原理

HTTP

超文本传输协议(HyperText Transfer Protocol, HTTP)是用于分布式协作超媒体信息系统的应用协议。它是万维网数据通信的基础。HTTP使用了可靠的数据传输协议, 可以确保数据在传输过程不会丢失或损失

Web服务器是负责托管Web资源, 即网页的内容来源。最简单的Web资源是Web服务器文件系统上的文件。这些文件可以包含任何内容: 它们有可能是文本文件、HTML文件、图像文件、视频文件或任何其他格式的文件。资源也有可能不是文件, 而是脚本按照请求生成的动态内容。每个资源都有一个统一资源标识符(Uniform Resource Identifier, URI)进行标识。最常见的URI形式是统一资源定位符(Uniform Resource Locatir, URL), 通常称其为Web地址。

一个最典型的请求-响应的例子如下:

HTTP支持几种不同的请求命令, 这些方法被成为那个HTTP方法。常见的HTTP方法如下表所示

HTTP方法 描述
GET 将资源从服务器发送到客户端
PUT 将客户端数据存储在服务器中
DELETE 从服务器中删除指定的资源
POST 将客户端数据发送到服务器网关应用程序
HEAD 仅发送请求资源的响应中的HTTP标头

 每个HTTP响应消息都带有状态码。常见的HTTP状态码如下表所示

HTTP状态码 描述
200 正常: 资源正确返回
302 重定向: 去其他地方获取资源
404 未找到: 找不到这个资源

浏览器

Web浏览器就是通常所说的浏览器。是用于访问万维网信息的软件应用程序。万维网上的网页、图像和视频都由不同的URL标识, 使用浏览能够检索这些信息, 并且在用户的设备上显示出来。

浏览器在结构上可以分为多个组件, 如图所示:

 MVC模式

模型--视图--控制器(Model-View-Controller, MVC)是一种通常用于开发用户界面的体现结构模式, 它将应用程序划分为三个模块。这样划分实现了解耦, 有利于代码的复用和并行并发。

 

1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。

2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。

3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。

这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。

 

Python Web编程

通用网关接口

通用网关接口(Common Gateway Interface, CGI)是一种定义程序和服务器交互方式的标准协议。生成动态网页的应用程序一般称为CGI脚本。通常情况下, CGI脚本发出执行请求并生成HTML文本。

简单的说, 来自客户端的HTTP POST请求将表单数据通过标准输入发送到CGI脚本。脚本通过换届变量获取其他数据(如URL路径和HTTP标头数据)。

import cgitb

cgitb.enable()
print("Content-Type: text/plain;charset=utf-8")  # 标准输出作为HTTP头内容
print()
print( "Hello World" )  # 标准输出作为HTTP内容

WSGI协议

Web服务网关接口(Python Web Server Gateway Interface, WSGI)是一种为Python语言定义的Web服务器和Web应用程序或框架之间的简单而同样的接口。即这是一个规范,描述了Web服务器如何与Web应用程序交互、Web应用程序如何处理请求。

WSGI的最大优点是统一了应用程序编程接口。如果使用的框架支持WSGI, 那么应用程序能在所有支持WSGI的Web服务器上进行部署。

WSGI一个非常好的特性是中间件。中间件是应用程序的一层, 用户可以在其中添加各种功能。

用于连接到各种底层网关的代码称为WSGI服务器。

from wsgiref.simple_server import make_server


def run(env, response):
    """
    :param env: 请求相关的所有数据
    :param response: 响应相关的所有数据
    :return: 返回给浏览器的数据
    """
    # print(env)  # 大字典 wsgiref模块帮你处理好http格式的数据, 封装成字典更方便操作

    response('200 OK', [])  # 响应首行 响应头
    # 从env中获取
    current_path = env.get('PATH_INFO')

    if current_path == '/index':
        return [b'index path']
    elif current_path == '/login':
        return [b'login path']

    return [b'404 error']


if __name__ == '__main__':
    server = make_server('127.0.0.1', 8080, run)
    """
    会实时监听127.0.0.1:8080地址, 只要有客户端访问, 都会交给run函数处理(加括号触发run函数的运行)
    """
    server.serve_forever()  # 启动服务端

模板引擎

模板引擎用于将模板与数据模型组合起来以生成结果文档。

template = Template("<html><body>Hello ${name}</body></html>")  # 模板

print(template.substitute(dict(name='Dinsdale')))  # 输出模板

使用模板引擎有助于将HTMl代码分解为各个部分。这样既降低了代码之间的耦合, 又有利于代码的复用。为了基于复杂的模型数据生成复杂的HTML文本, 通常需要for和if这样的控制语句。

 

快速上手Django

配置开发环境

首先, 需要确保计算机已经安装了Python和pip, 可通过执行下面的命令查看是否成功安装。

$ python --version
$ pip --version

从根本上说, Python虚拟环境的主要目的是为Python项目创建一个独立的环境, 即每个项目都可以拥有自己的依赖项。

安装virtualenv软件包, 

pip install virtualenv
使用清华源安装:pip
install virtualenv -i https://pypi.python.org/simple/

创建虚拟环境

cd 到存放虚拟环境光的地址

virtualenv ENV 在当前目录下创建名为ENV的虚拟环境(如果第三方包virtualenv安装在python3下面,此时创建的虚拟环境就是基于python3的)

virtualenv -p /usr/local/bin/python2.7 ENV2 参数 -p 指定python版本创建虚拟环境

virtualenv --system-site-packages ENV 参数 --system-site-packages 指定创建虚拟环境时继承系统三方库

激活和退出虚拟环境

cd ~/ENV 跳转到虚拟环境的文件夹

source bin/activate 激活虚拟环境

pip list 查看当前虚拟环境下所安装的第三方库

deactivate 退出虚拟环境

创建项目

Django自带的django-admin命令行工具, 可以很方便地创建项目

(django_env) ➜  第一章 Django简介 django-admin startproject quickstart

创建的项目的结构如下:

|-------- quickstart
    |---- manage.py
    |---- qioclstart
          |---- __init__.py
          |---- setting.py
          |---- urls.py
          |---- wsgi.py
  • 最外层的quickstart只是一个名字, 可以替换成其他的, 对项目没有影响
  • manage.py 是一个命令行程序, 允许用户以各种方式与此项目进行交互
  • quickstart 是项目的包名, 引用这个项目的代码时需要用到
  • quickstart/__init__.py 是一个空文件, 用于告诉Python这个目录应被视为一个包
  • quickstart/setting.py 是项目的配置文件, Django推荐用代码的方式来管理配置
  • quickstart/urls.py 是项目的URL声明, 标明站点的"目录"
  • quickstart/wsgi.py 是使用WSGI部署访问的入口

配置说明

上面创建的settings.py文件就是Django项目的配置文件。这个文件自身是一个Python的模块, 因此不允许出现Python语法错误。可以使用Python语法来动态设置配置, 也可以从其他文件中引入配置。

在使用Django的时候, 一定要指定配置路径, 指定的方式是配置环境变量DJANGO_SETTINGS_MODULE。

settings.py文件可以为空, 因为Django为每一个配置都设定了默认值。默认配置的代码路径在django/config/global_settings.py文件中。如果自定义的配置和默认的配置不同, 则可以通过下面的命令看出差别。

(django_env) ➜  quickstart python manage.py diffsettings   

在启动的使用, Django会先从global_settings.py中读取配置, 然后在项目定义的settings.py文件中读取配置, 根据需要覆盖全局配置。

可以在应用中读取配置对象

from django.conf import settings

if settings.debug:
    # todo

也可以在应用运行的时候修改配置对象(一般不推荐这样做), 这个配置会立刻生效

from django.conf import settings

settings.DEBUG = True

创建应用

创建应用的命令如下:

(django_env) ➜  quickstart python manage.py startapp myapp
(django_env) ➜  quickstart django-admin startapp myappTow

创建的应用文件夹结构如下

myapp/
|-------- __init__.py
|-------- admin.py
|-------- apps.py
|-------- modes.py
|-------- tests.py
|-------- views.py
|-------- migrations
|           |-------- __init__.py
  • admin.py 用于定制应用的管理页面
  • migrations 文件夹用于模型出现修改时对应数据库的更改操作
  • __init__.py 是一个空文件, 用于告诉Python这个目录应该被视为一个包
  • models.py 用于存储应用的模型, 即MVC中的M
  • tests.py 一般用来放单元测试的代码
  • views.py 用来放视图函数

创建之后需要让Django指定应该使用它。修改quickstart/settings.py, 在INSTALLED_APPS中添加应用名。

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

启动开发服务器

Django自带命令行工具可用来启动开发服务器。使用runserver命令启动一个HTTP服务器用于开发和调试。

(django_env) ➜  quickstart python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 15 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 03, 2020 - 08:38:17
Django version 2.1.8, using settings 'quickstart.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

启动出现以上输出, 表示启动成功, 这是一个Python编写的轻量级Web服务器。

实现runserver的代码路径为 django/core/management/commands/runserver.py

默认情况下, runserve命令启动的服务器会监听内部IP的8000端口。可以传入参数改变服务器绑定的IP和端口

(django_env) ➜  quickstart python manage.py runserver 0.0.0.0:8080

编写一个页面

在myapp/views文件中, 写一个简单的视图函数。

from django.http import HttpResponse  # 引入响应对象

def index(request):
    return HttpResponse(u'你好, 朋友')

想让Django知道并且使用这个函数, Django提供了一个类似路由功能的对象-URLConf。先在myapp目录下创建一个名为urls.py的文件。然后在这个文件中写入代码

from django.urls import re_path
from . import views  # 引用应用的视图模块

urlpatterns = [
    re_path(r'^', views.index),  # 路由配置
]

上面的文件放在myapp目录下, 用来负责这个应用的路由。一个项目可能包含多个应用。因此比较好的是在项目级别页配置路由, 这个配置用于将请求匹配分发到各个应用。现在来更改项目的路由配置。编辑quickstart/urls.py文件。代码如下:

from django.urls import path, include

urlpatterns = [
    path('myapp/', include('myapp.urls'))
]

重新启动runserver, 在浏览器中打开链接http://127.0.0.1:8080/myapp, 就能看的"你好, 朋友"这句话了

 

 

 

 

 

 

 

 

posted @ 2020-08-03 15:00  愚者丶  阅读(192)  评论(0编辑  收藏  举报