精华内容
下载资源
问答
  • django原理
    2019-08-08 00:00:10

    Django的ORM来源:django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。

    Django连接数据库MySQL:使用MySQL数据库首先需要安装驱动程序。(pip install PyMySQL 调用时为 import pymysql)

    Django默认导入的mysql的驱动程序是MySQLdb,然而MySQLdb对于py3支持不全,所以这里使用PyMySQL。 用于Python链接Mysql数据库的接口。需要在__init__文件指定

    from pymysql import install_as_MySQLdb    install_as_MySQLdb()  。作用是让Django的ORM能以mysqldb的方式来调用PyMySQL。

    ORM介绍:对象关系映射。在项目与数据库之间起桥梁作用。

    在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。例如:模型类BookInfo --映射到–> 数据表bookinfo。使数据库设计更加简单

    ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。

    核心思想: 用面向对象的方式去操作数据库的创建表、增加、修改、删除、查询等操作。把面向对象中的类和数据库表一一对应,通过操作类和对象,对数据表实现数据操作,不需要写sql,由orm框架生成。

    Django的ORM操作原理:Django的orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句;所有使用Django开发的项目无需关心程序底层使用的是MySQL、Oracle、sqlite…,如果数据库迁移,只需要更换Django的数据库引擎即可

    Django的ORM优点缺点:

    1)只需要面向对象编程, 不需要面向数据库编写代码.

    对数据库的操作都转化成对类属性和方法的操作.不用编写各种数据库的sql语句.

    2)实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.不在关注用的是mysql,oracle…等.通过简单的配置就可以轻松更换数据库, 而不需要修改代码.

    3)在映射过程中有性能缺失,面向对象编程到sql语句之间的映射需要过程时间,造成性能缺失

    配置步骤:

    1. 在settings.py中配置了数据库的连接配置信息

    2.指定调用MySQL的驱动程序PyMySQL

    1. 在MySQL中创建数据库

    4.创建模型:

    5.迁移

    1)生成迁移文件 python manage.py makemigrations

    2)同步到数据库中 python manage.py migrate

    版权声明:本文为CSDN博主「jj91589」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/jj915894495/article/details/82292445

    更多相关内容
  • 深入了解django原理

    2019-02-22 21:01:53
    下面代码体现django原理 import socket server_sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server_sk.bind((‘127.0.0.1’,8888))(设置端口号) server_sk.listen(128)(高并发支持数量) while True:...

    架构的本质其实就是一个socket

    下面代码体现django原理

    import socket
    server_sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server_sk.bind((‘127.0.0.1’,8888))(设置端口号)
    server_sk.listen(128)(高并发支持数量)

    while True:
    new_sk , addr=server_sk.accept()
    content = new_sk.recv(1024).decode()
    print(content)

    new_sk.send('HTTP/1.1   200 OK\r\n'.encode())
    new_sk.send('Content-Type:text/html;charset=utf-8\r\n'.encode())
    new_sk.send('\r\n'.encode())
    new_sk.send("孙悟空".encode())
    new_sk.close()
    

    server_sk.close()

    (在浏览器中打开的结果)
    在这里插入图片描述
    这就实现了字符串在浏览器中打开

    (print结果)

    在这里插入图片描述

    改进上述代码

    import socket
    server_sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server_sk.bind((‘127.0.0.1’,8888))
    server_sk.listen(128)

    def index(url):
    s = ‘这是{}页面’.format(url).encode()
    return s

    def hero_list(url):
    s = ‘这是{}页面’.format(url).encode()
    return s
    def error(url):
    s=‘404页面’.encode()
    return s

    func_list = [
    (’/index’,index),
    (’/hero_list’,hero_list),
    (’/error’,error)
    ]
    while True:
    new_sk, addr = server_sk.accept()
    content = new_sk.recv(1024).decode()
    con = content.split(’\r\n’)[0] #切片获得请求首行在这里插入图片描述
    url = con.split(’ ')[1] #切片获得所需输入路径(在浏览器中输入 127.0.0.1:8888/index)则index,出现在请求首行如图所示)
    在这里插入图片描述
    (浏览器中显示)
    在这里插入图片描述

    f=None
    for func  in func_list:
        if func[0] == url:
            f=func[1]
    if f:
        response=f(url)
    else:
        response=error(url)
    new_sk.send('HTTP/1.1 200 OK\r\n'.encode())
    new_sk.send('Content-Type:text/html;charset=utf-8\r\n'.encode())
    new_sk.send('\r\n'.encode())
    new_sk.send(response)
    new_sk.close()
    

    server_sk.close()

    展开全文
  • Nginx+uWSGI+Django原理 Python的Web开发中,如果使用Django框架,那么较为成熟稳定的服务器架构一般是Nginx+uWSGI+Django。而为什么一定要三个结合在一起呢?直接使用Django的runserver来启动服务器进程,或者...

    Nginx+uWSGI+Django原理

    Python的Web开发中,如果使用Django框架,那么较为成熟稳定的服务器架构一般是Nginx+uWSGI+Django。而为什么一定要三个结合在一起呢?直接使用Django的runserver来启动服务器进程,或者uWSGI+Django可不可以呢?为什么? 
    概念说明:

    • APP(应用程序),就是开发者写的应用程序,例如django,bottle这些。记录怎么处理客户端发来的请求的逻辑部分。
    • WSGI,是一个协议,Python用于Web开发的协议
    • uWSGI,是一个程序,充当Web服务器或中间件。
      • 如果架构是Nginx+uWSGI+APP,uWSGI是一个中间件
      • 如果架构是uWSGI+APP,uWSGI是一个服务器
    • uwsgi,是uWSGI程序实现的一个自有的协议。

    Web协议出现顺序: 
    CGI -> FCGI -> WSGI -> uwsgi

    1. CGI,最早的协议
    2. FCGI,比CGI快
    3. WSGI,Python专用的协议
    4. uwsgi,比FCGI和WSGI都快,是uWSGI项目自有的协议,主要特征是采用二进制来存储数据,之前的协议都是使用字符串,所以在存储空间和解析速度上,都优于字符串型协议.官方介绍

    一、WSGI协议

    浏览器请求一个页面的流程:

    1. 浏览器发送请求给服务器,包含请求头和请求体
    2. 服务器解析请求头和请求体
    3. 服务器根据请求信息来处理请求,生成返回内容
    4. 服务器生成响应头和响应体
    5. 服务器返回响应给浏览器,浏览器显示给用户

    一个网站,一般有很多个不同的请求,在这些请求中,基本1,2,4,5部都是固定的,变的只有第三步,所以把这四步抽象出来,让开发者只关注第三步,这样就可以极大提升开发效率。所以WSGI协议诞生了。 
    WSGI,全称 Web Server Gateway Interface。是Python专用的协议,其他语言没有。用于处理Web服务器和应用程序(APP)的交互信息。很多Web框架(如:django)都会自带WSGI服务器,但是性能不好,只作测试用途。

    实现一个最简单的服务器

    1. app.py
    1. import pprint
    2. def application(environ, start_response):
    3. pprint.pprint(environ)
    4. start_response('200 OK',[('Content-Type','text/html')])
    5. return'<h1>Hello, web!</h1>'
    • environ参数是一个字典对象,保存HTTP请求的信息。例如URL路径,域名,请求头,请求参数等
    • start_response参数是一个函数,用于向wsgiref提供响应头的设置,只能调用一次。
    1. server.py
    1. # 从wsgiref模块导入:
    2. from wsgiref.simple_server import make_server
    3. # 导入我们自己编写的application函数:
    4. from app import application
    5.  
    6. # 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
    7. httpd = make_server('',8000, application)
    8. print"Serving HTTP on port 8000..."
    9. # 开始监听HTTP请求:
    10. httpd.serve_forever()
    1. 启动python server.py,就可以通过localhost:8000访问了

    wsgiref模块是python提供的,用于测试和学习的简单的WSGI服务器模块。 
    这个模块监听8000端口,把Http请求,根据WSGI协议,转换application函数中的environ参数,然后调用application函数。 
    wsgiref会把application函数提供的响应头设置转换为HTTP协议的响应头,把application的返回(return)作为响应体,根据HTTP协议,生成响应,返回给浏览器。

    Alt text

    这样,应用程序就不需要关注底层的HTTP协议细则了

    二、CGI和FastCGI

    CGI是Common Gateway Interface,即通用网关接口,是一个协议,是外部应用程序(CGI程序)与Web服务器之间的接口标准。该协议定义了Web服务器在调用应用程序时需要传输的参数和应用程序怎么返回结果给Web服务器,其实跟WSGI类似。 
    CGI的一个特点是,对于每一个HTTP请求,Web服务器都会新建一个进程(fork),等应用程序返回结果后,这个进程就会结束。这样的后果是,一旦HTTP请求多的时候,Web服务器会频繁创建进程,大家都知道,创建进程的开销是非常大的,所以这种做法会影响服务器的性能,所以就有了FastCGI。 
    FCGI的做法是在Web服务器启动的时候,就创建多个应用程序进程,当Web服务器接收到HTTP请求时,就把请求分发给其中一个空闲的进程。相当于MYSQL连接池的原理。这样就可以避免频繁地fork进程。FCGI另一个特点是支持分布式,也就是Web服务器和应用程序可以在不同的机器。 
    CGI和WSGI的区别是:

    • CGI的出现更加早,这个是通用的接口,应用程序可以是JAVA,Python,等多种语言程序
    • WSGI是Python专用的,在CGI的基础上改进的协议

    三、Nginx

    Ningx是一个反向代理服务器 
    什么是反向代理?

    1. 正向代理,例如FQ用的代理服务器就是正向代理,浏览器主动请求代理服务器,代理服务器转发请求到对应的目标服务器
    2. 反向代理,部署在Web服务器上,代理所有外部网络对内部网络的访问。浏览器访问服务器,必须经过这个代理,是被动的。 
      正向代理的主动方是客户端,反向代理的主动方是Web服务器。 
      结构图: 
      Alt text

    反向代理的作用:

    1. 安全,客户端对Web服务器的访问需要先经过反向代理服务器。这样可以防止外部程序对Web服务器的直接攻击。
    2. 负载均衡,反向代理服务器可以根据Web服务器的负载情况,动态地把HTTP请求交给不同的Web服务器来处理,前提是要有多个Web服务器。
    3. 提升Web服务器的IO性能。一个HTTP请求的数据,从客户端传输给服务器,是需要时间的,例如N秒,如果直接传给Web服务器,Web服务器就需要让一个进程阻塞N秒,来接收IO,这样会降低Web服务器的性能。如果使用反向代理服务器,先让反向代理服务器接收完整个HTTP请求,再把请求发给Web服务器,就能提升Web服务器的性能。还有一些静态文件的请求,可以直接交给反向代理来处理,不需要经过Web服务器。

    Nginx是一个高性能的HTTP和反向代理服务器。

    Nginx+uWSGI+应用程序的架构: 
    Alt text

    其中Nginx和uWSGI之间可以通过CGI,FCGI和uwsgi协议通信,当然uwsgi的性能是最好的。

    四、总结

    1. uWSGI+Django比单独使用Django的好处:
      • 支持的并发量更高
      • 方便管理多进程,发挥多核的优势
      • 提升性能,因为uwsgi协议比WSGI协议有优势
    2. Nginx+uWSGI+Django比uWSGI+Django好处(参考反向代理的作用):

    最后附上一个介绍Nginx+uWSGI+Django的幻灯片

    参考: 
    http://www.biaodianfu.com/cgi-fastcgi-wsgi.html 
    http://blog.csdn.net/qiaofeiw/article/details/9207359 
    http://www.cnblogs.com/wanghetao/p/3934350.html 
    http://book.51cto.com/art/201202/314840.htm 
    http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832689740b04430a98f614b6da89da2157ea3efe2000 
    https://www.douban.com/note/13508388/ 
    http://www.nowamagic.net/academy/detail/1330308 
    http://www.itopers.com:8080/?p=586

     

    分类: Python

    好文要顶 关注我 收藏该文  

    Xjng
    关注 - 3
    粉丝 - 53

    +加关注

    8

    0

    « 上一篇:uWSGI uwsgi_response_write_body_do(): Connection reset by peer 报错的解决方法
    » 下一篇:Python中docstring文档的写法

    posted @ 2016-05-16 18:21 Xjng 阅读(13233) 评论(11) 编辑 收藏

     

    展开全文
  • Django原理学习

    2017-12-08 17:58:31
    django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。 在django项目的settings模块中,有一个 MIDDLEWARE_...

    中间件简介

    django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

    在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件

    中间件中一共有四个方法:

    process_request

    process_view

    process_exception

    process_response

    中间件之process_request,process_response

    process_request(self,request)

    process_response(self, request, response)

    当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者

    在django中叫中间件,在其他web框架中,有的叫管道,httphandle


    上述截图中的中间件都是django中的,我们也可以自己定义一个中间件,我们可以自己写一个类,但是必须继承MiddlewareMixin

    所以需要导入:from django.utils.deprecation import MiddlewareMixin

    我们在项目文件下创建一个Middle目录,并在下面创建m1.py代码例子如下:


    #AUTHOR:FAN
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class Row1(MiddlewareMixin):
        def process_request(self,request):
            print("中间件1请求")
        def process_response(self,request,response):
            print("中间件1返回")
            return response
    
    class Row2(MiddlewareMixin):
        def process_request(self,request):
            print("中间件2请求")
            # return HttpResponse("走")
        def process_response(self,request,response):
            print("中间件2返回")
            return response
    
    class Row3(MiddlewareMixin):
        def process_request(self,request):
            print("中间件3请求")
        def process_response(self,request,response):
            print("中间件3返回")
            return response

    这样当页面发起请求的时候:后台效果如下



    但是如果当请求到达请求2的时候直接不符合条件返回,程序将吧请求直接发给中间件2返回,然后依次返回到请求者

    用如下图进行理解:



    当然这是在django1.10的时候,在之前的版本的时候是直接返回到最后一个中间件的response,然后向上依次返回,最后到发起请求

    中间件之process_view

    process_view(self, request, callback, callback_args, callback_kwargs)

    我们在m1.py文件中的的代码进行更改:

    #AUTHOR:FAN
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class Row1(MiddlewareMixin):
        def process_request(self,request):
            print("中间件1请求")
        def process_response(self,request,response):
            print("中间件1返回")
            return response
    
        def process_view(self, request, callback, callback_args, callback_kwargs):
            print("中间件1view")
    
    class Row2(MiddlewareMixin):
        def process_request(self,request):
            print("中间件2请求")
            # return HttpResponse("走")
        def process_response(self,request,response):
            print("中间件2返回")
            return response
        def process_view(self, request, callback, callback_args, callback_kwargs):
            print("中间件2view")
    
    class Row3(MiddlewareMixin):
        def process_request(self,request):
            print("中间件3请求")
        def process_response(self,request,response):
            print("中间件3返回")
            return response
        def process_view(self, request, callback, callback_args, callback_kwargs):
            print("中间件3view")

    高亮部分为添加的内容,这样运行之后效果如下:



    我们通过下图进行分析上面的过程:







    当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户

    中间件之process_exception

    process_exception(self, request, exception)

    当views的函数中出现错误时,就会执行process_exception方法

    如果在中间中添加了process_exception方法,工作图示为:






    这样当用户发起请求的时候到达中间件3的process_request之后会到达urls路由关系映射这里,如果匹配到了就会到中间件1的process_view,然后依次传递到中间件3的process_view,到达view函数。如果view函数中有报错,则会从中间件3依次向上判断每个中间件的process_exception是否能匹配到这个错误信息,如果匹配到则直接返回到最后一个中间件,这里即中间件3的process_response,然后依次返回到用户,如果没有匹配到这个错误则直接在页面显示错误信息。如果view函数中没有错误,则到中间3即最后一个中间件3的process_response,然后依次向上,传到用户

    中间件之process_template_responseprocess

    process_template_response(self,request,response)

    只有当views函数中返回的对象中具有render方法,是就会直接process_template_responseprocess

     

    所有的努力都值得期许,每一份梦想都应该灌溉!








    展开全文
  • Nginx+uWSGI+Django原理

    2017-10-22 23:18:13
    Python的Web开发中,如果使用Django框架,那么较为成熟稳定的服务器架构一般是Nginx+uWSGI+Django
  • 使用Python Django开发web应用 web应用原理和django原理 Web应用原理 Web服务器有Apache、nginx、Tomcat 数据库服务器有MySQL、SQLite、SQL server、Oracle等 如果是静态网页,那么Web服务器可以直接返回应答给...
  • 为了让您充分理解 Django 的工作原理,这份文档为您详细描述了相关的技术细节,不过这并不是一份入门教程或者是参考文档(我们当然也为您准备了这些) 目前的Django 最新版本为3.0.5 它的特点为...
  • Django基本原理

    万次阅读 2017-11-29 13:56:03
    Django
  • 1、下载安装2、创建django框架 1、下载安装 Django框架是使用python语言开发的,因此可以直接使用pip进行安装: pip install django 可以指定安装版本 我使用的python 3.8 选择的django 3.1.7(推荐最新安装django...
  • Django工作原理简介

    千次阅读 2018-04-06 11:01:51
    先简单的介绍一下django的工作原理介绍流程:1. 用户通过浏览器请求一个页面的url2. 请求到达Request Middlewares(中间件),中间件对request做一些预处理或者直接response请求3. URLConf通过urls.py文件和请求的...
  • 许久没有更新博客了,我tm今天就要立个flag,接下来两周我要把Django的基本使用方法更新完 目录: 1、 2、 3、 前言: 要了解如何使用Django前,我觉得需要简单了解一下python是如何处理http协议的;此篇...
  • 1 什么是负载均衡? 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台...
  • 主要介绍了django框架中间件原理与用法,结合实例形式详细分析了Django框架常用中间件与基本使用技巧,需要的朋友可以参考下
  • 一、什么是Django中间件  Django 中间件是用来处理Django的请求request和响应response的框架级别的钩子,它是一个轻量,低级别的插件系统,用于全局范围内改变Django的输入,输出。每个中间件组件都负责做一些特定...
  • Django框架----工作原理

    千次阅读 2019-03-25 10:25:24
    2、访问url时候,Django会根据ROOT_URLCONF的设置来装载URLConf,按顺序逐个匹配URLConf里的URLpatterns 3、匹配成功,调用相关的视图(view)函数,并把HtppRequest对象作为第一个参数 4、视图函数中的方法...
  • 主要介绍了python web框架 django wsgi原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
  • 这篇文章主要介绍了Django异步任务线程池实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 当数据库数据量很大时(百万级),许多批量数据修改请求的...
  • 3,uWSGI 将接收到的包进行处理,并转发给wsgi, wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,wsgi将返回值进 行打包,转发给uWSGI, uWSGI接收后转发给nginx,nginx最终将...
  • 主要介绍了Django路由层URLconf作用及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Python的Web开发中,如果使用Django框架,那么较为成熟稳定的服务器架构一般是Nginx+uWSGI+Django。而为什么一定要三个结合在一起呢?直接使用Django的runserver来启动服务器进程,或者uWSGI+Django可不可以呢?为...
  • stark组件是仿照django的admin模块开发的一套组件,它的作用是在网页上对注册的数据表进行增删改查操作 ... 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'djang
  • 通过一个内嵌类 “class Meta” 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model): bar = models.CharField(maxlength=30) class Meta: # … Model 元数据就是 “不是一个字段的任何数据” —...
  • 一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要...
  • 主要介绍了Django Rest framework频率原理与限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种: 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承) 可以用不同的函数针对不同的HTTP方法处理,而不是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,374
精华内容 9,349
关键字:

django原理

友情链接: flopcy-cycle.rar