博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django 初识
阅读量:7123 次
发布时间:2019-06-28

本文共 6366 字,大约阅读时间需要 21 分钟。

我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。

"""根据URL中不同的路径返回不同的内容--函数进阶版返回HTML页面让网页动态起来"""import socketimport timesk = socket.socket()sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口sk.listen()  # 监听# 将返回不同的内容部分封装成函数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),]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

我们利用wsgiref模块来替换我们自己写的web框架的socket server部分:

"""根据URL中不同的路径返回不同的内容--函数进阶版返回HTML页面让网页动态起来wsgiref模块版"""import timefrom 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()

jinja2

上面的代码实现了一个简单的动态,我完全可以从数据库中查询数据,然后去替换我html中的对应内容,然后再发送给浏览器完成渲染。 这个过程就相当于HTML模板渲染数据。 本质上就是HTML内容中利用一些特殊的符号来替换要展示的数据。 我这里用的特殊符号是我定义的,其实模板渲染有个现成的工具: jinja2

下载jinja2:

pip install jinja2
 
index2.html文件

使用jinja2渲染index2.html文件:

from wsgiref.simple_server import make_serverfrom jinja2 import Templatedef index():    with open("index2.html", "r") as f:        data = f.read()    template = Template(data)  # 生成模板文件    ret = template.render({"name": "Alex", "hobby_list": ["烫头", "泡吧"]})  # 把数据填充到模板里面    return [bytes(ret, encoding="utf8"), ]def home():    with open("home.html", "rb") as f:        data = f.read()    return [data, ]# 定义一个url和函数的对应关系URL_LIST = [    ("/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 URL_LIST:        if i[0] == url:            func = i[1]  # 去之前定义好的url列表里找url应该执行的函数            break    if func:  # 如果能找到要执行的函数        return func()  # 返回函数的执行结果    else:        return [bytes("404没有该页面", encoding="utf8"), ]if __name__ == '__main__':    httpd = make_server('', 8000, run_server)    print("Serving HTTP on port 8000...")    httpd.serve_forever()

现在的数据是我们自己手写的,那可不可以从数据库中查询数据,来填充页面呢?

使用pymysql连接数据库:

conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="xxx", db="xxx", charset="utf8")cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)cursor.execute("select name, age, department_id from userinfo")user_list = cursor.fetchall()cursor.close()conn.close()

创建一个测试的user表:

CREATE TABLE user(  id int auto_increment PRIMARY KEY,  name CHAR(10) NOT NULL,  hobby CHAR(20) NOT NULL)engine=innodb DEFAULT charset=UTF8;

模板的原理就是字符串替换,我们只要在HTML页面中遵循jinja2的语法规则写上,其内部就会按照指定的语法进行相应的替换,从而达到动态的返回内容。

Django

安装(安装最新LTS版):

pip3 install django==1.11.9

创建一个django项目:

下面的命令创建了一个名为"mysite"的Django 项目:

django-admin startproject mysite

目录介绍:

mysite/├── manage.py  # 管理文件└── mysite  # 项目目录    ├── __init__.py    ├── settings.py  # 配置    ├── urls.py  # 路由 --> URL和函数的对应关系    └── wsgi.py  # runserver命令就使用wsgiref模块做简单的web server

运行Django项目:

python manage.py runserver 127.0.0.1:8000

模板文件配置:

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',            ],        },    },]

静态文件配置:

STATIC_URL = '/static/'  # HTML中使用的静态文件夹前缀STATICFILES_DIRS = [    os.path.join(BASE_DIR, "static"),  # 静态文件存放位置]

看不明白?有图有真相:

刚开始学习时可在配置文件中暂时禁用csrf中间件,方便表单提交测试。

MIDDLEWARE = [    'django.middleware.security.SecurityMiddleware',    'django.contrib.sessions.middleware.SessionMiddleware',    'django.middleware.common.CommonMiddleware',    # 'django.middleware.csrf.CsrfViewMiddleware',    'django.contrib.auth.middleware.AuthenticationMiddleware',    'django.contrib.messages.middleware.MessageMiddleware',    'django.middleware.clickjacking.XFrameOptionsMiddleware',]

转载于:https://www.cnblogs.com/zhaodafa/p/9166835.html

你可能感兴趣的文章
Linux ed命令
查看>>
我的友情链接
查看>>
linux命令随手记
查看>>
vim+taglist+cscope+ctage
查看>>
Python 6.1 错误处理
查看>>
AWS - VPC Peering
查看>>
RHCE 学习笔记(31) - 防火墙 (中)
查看>>
puppet自动化运维
查看>>
linux系统配置基础--此篇会不断的完善
查看>>
git命令记录
查看>>
jenkins 配置
查看>>
关于dubbo服务的xml配置文件报错的问题
查看>>
Linux 环境变量和alias设置
查看>>
Spring MVC +Hibernate集成
查看>>
搭建LAMP环境,并实践基于DNS做基于域名的虚拟主机
查看>>
neutron-metadata-proxy无响应,导致windos2003密码透传失败
查看>>
用Python实现用户登录接口
查看>>
毕业前1个月的想法
查看>>
例程详析动态链接库
查看>>
geopy使用详解
查看>>