django框架-----基础

一,什么是Django?

     Django是python语言编写的一个全栈式Web框架,可以帮助我们快速编写一个具有数据库功能,增删改查,后台管理等功能的网站。

 

二,安装Django

       1,先去官网下载一个LTS版的Django。

       2,在命令行创建一个django项目

              下面命令创建了一个名为‘mysite’的django项目:

              django-admin  startproject  mysite

        3,项目目录介绍:

               mysite/

                ------manage.py      管理文件

                -------mysite         #项目目录

                          ------   __init__.py

                          ------   settings.py       #配置

                          -------    urls.py     #路由     ------>    URL和函数的对应关系

                          --------     wsgi.py      #  runserver命令就使用wsgiref模块做简单的web server

       4,运行Django项目:

               python   manage.py   runserver   127.0.0.1:8000

       5,模板文件配置:

                 TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "template")],  # template文件夹位置
        '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',
            ],
        },
    },
]

          6,静态文件配置:

              STATIC_URL=‘/static/’              #HTML中使用静态文件夹前缀

              STATICFILES_DIRS= [

                            os.path.join(BASE_DIR,"static"),        #静态文件存放位置

               ]

      由图所示:

          三,django基础三大必备知识点:

                   1,HttpResponse:内部传入一个字符串参数,返回给浏览器。

                          例:

                                   def    index(request):

                                            #业务逻辑代码

                                             return   HttpResponse("ok")

                

                    2,render:

                              除了request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。将数据填充进模板文件,最后把结果返回给浏览器。注意:待渲染的模板文件的相关配置文件也需要添加进配置文件中,不然无法展示相关的渲染效果。

                      例:def   index(request):

                                  return   render(request,“index.html")

 

                   3,redirect: 接受一个URL参数,表示跳转到指定的URL。

                       例:def   index(request):

                                      #业务逻辑代码

                                       return  redirect(”/home/“)

         

               接下来我们暂停一下,先来复习一下socket。

四 ,Web框架的本质就是一个socket客户端与socket服务端的数据通信。

        最简易的socket服务端

               import    socket

                

               sk = socket.socket()

               sk.bing(("127.0.0.1",80))

               sk.listen()               #链接池

               

               while    True:

                          conn,addr = sk.accept()      #接收链接

                          data  =   conn.recv(8096)       #接收客户端数据

                           conn.send (b"ok")             #发送数据

                            conn.close() 

 

可以说Web服务本质上都是在这十几行代码基础上扩展出来的。

用户的浏览器一输入网址,会给服务端发送数据,那浏览器会发送什么数据?怎么发?这个谁来定? 你这个网站是这个规定,他那个网站按照他那个规定,这互联网还能玩么?

所以,必须有一个统一的规则,让大家发送消息、接收消息的时候有个格式依据,不能随便写。

这个规则就是HTTP协议,以后浏览器发送请求信息也好,服务器回复响应信息也罢,都要按照这个规则来。

HTTP协议主要规定了客户端和服务器之间的通信格式,那HTTP协议是怎么规定消息格式的呢?

HTTP协议介绍:https://www.cnblogs.com/liqingxiaobai/articles/9085318.html

 

基于HTTP协议,我们就来改写一下socket服务端框架:

 

例:

"""
根据URL中不同的路径返回不同的内容--函数进阶版
返回独立的HTML页面
"""

import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口
sk.listen()  # 监听


# 将返回不同的内容部分封装成函数
def index(url):
    # 读取index.html页面的内容
    with open("index.html", "r", encoding="utf8") as f:
        s = f.read()
    # 返回字节数据
    return bytes(s, encoding="utf8")


def home(url):
    with open("home.html", "r", encoding="utf8") as f:
        s = f.read()
    return bytes(s, encoding="utf8")


# 定义一个url和实际要执行的函数的对应关系
list1 = [
    ("/index/", index),
    ("/home/", home),
]

while 1:
    # 等待连接
    conn, add = sk.accept()
    data = conn.recv(8096)  # 接收客户端发来的消息
    # 从data中取到路径
    data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串
    # 按\r\n分割
    data1 = data.split("\r\n")[0]
    url = data1.split()[1]  # url是我们从浏览器发过来的消息中分离出的访问路径
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 因为要遵循HTTP协议,所以回复的消息也要加状态行
    # 根据不同的路径返回不同内容
    func = None  # 定义一个保存将要执行的函数名的变量
    for i in list1:
        if i[0] == url:
            func = i[1]
            break
    if func:
        response = func(url)
    else:
        response = b"404 not found!"

    # 返回具体的响应消息
    conn.send(response)
    conn.close()

 

五,服务器程序与应用端程序

对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。

服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。

应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。

 

这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。

这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。

 

     接下来我们就用wsgiref来改写一下Web的socket服务端

 

"""
根据URL中不同的路径返回不同的内容--函数进阶版
返回HTML页面
wsgiref模块版
"""

import time
from wsgiref.simple_server import make_server


# 将返回不同的内容部分封装成函数
def index(url):
    with open("index.html", "r", encoding="utf8") as f:
        s = f.read()
        now = str(time.time())
        s = s.replace("@@oo@@", now)
    return bytes(s, encoding="utf8")


def home(url):
    with open("home.html", "r", encoding="utf8") as f:
        s = f.read()
    return bytes(s, encoding="utf8")


# 定义一个url和实际要执行的函数的对应关系
list1 = [
    ("/index/", index),
    ("/home/", home),
]


def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])       # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO']        # 取到用户输入的url
    func = None
    for i in list1:
        if i[0] == url:
            func = i[1]
            break
    if func:
        response = func(url)
    else:
        response = b"404 not found!"
    return [response, ]


if __name__ == '__main__':
    httpd = make_server('127.0.0.1', 8090, run_server)
    print("我在8090等你哦...")
    httpd.serve_forever()

 

posted @ 2018-06-11 20:17  鲁之敬  阅读(86)  评论(0编辑  收藏  举报