Python基础(Django)

发布时间:2019-08-18 13:02:19编辑:auto阅读(1627)

    介绍Django之前,先来明确几个基础概念:

    1、什么是Web框架?

        Web框架其实是建立web应用的一种方式,它为应用程序提供一套程序框架,这样开发者可以专注于编写清晰、易维护的代码,而无需从头做起。

        他们基本上都以相同的方式工作的:

        1、接收HTTP请求

        2、根据请求分派处理其的代码

        3、通过代码产生HTML页面

        4、创建带有内容的HTTP响应

    2、什么是MVC和MTV?

        MVC:其实就是Models(模型)、Views(视图)、Controller(控制器)的简称。

          模型:用来维护数据和定义数据的访问方法

          视图:用于数据的展示,也可以称为用户接口

          控制器:用于处理用户请求逻辑,先调用模型获取数据,再调用视图展示数据。


        MTV:其实是Models(模型)、Templates(模板)、Views(视图)的简称。

           模型:用来维护数据和定义数据的访问方法

          模板:用于数据的展示,对应MVC模式中的Views

          视图:用于指定某一特定URL的回调函数,描述了所要展现的数据,具体的展现交给模板


    关于Django

    Django前世今生就不做介绍,只说一点,它是MTV模式的。直接开始介绍使用(Tips:以下介绍中应用和app两个词表示的都是项目下的应用):

    1、安装

     官方下载:https://www.djangoproject.com/download/

     推荐直接pip安装:pip install Django==1.9.4


    2、配置settings.py

     2-1、区分测试环境和生产环境:      

        import socket

        if socket.gethostname() == 'Test-Hostname':

            #测试环境的一些配置,比如DATABASES配置,DEBUG开启情况等

        else:

            #生产环境的配置


     2-2、设置允许访问此项目的主机列表

        ALLOWED_HOSTS = ['*'] # *表示允许所有


     2-3、注册应用,这个操作一般是在创建应用之后才会用到。 

        INSTALLED_APPS = ('应用名称',)


     2-4、关闭CSRF(跨站请求伪造)防御,此操作适用于不太了解CSRF的同学,若不关闭,前端将不能POST提交数据到后台。关闭方法为找到此配置项然后注释掉即可。

        MIDDLEWARE_CLASSES = (#'django.middleware.csrf.CsrfViewMiddleware',)


     2-5、配置静态资源的目录(js、css、img等资源),需要增加配置,然后在项目目录下新建相应的目录即可。

        STATICFILES_DIRS = (
            os.path.join(BASE_DIR,'static'),

        )


     2-6、配置模板文件目录(html文件),需要增加配置,然后在项目目录下新建相应的目录即可。(1.9版本的django默认已配置)  

        TEMPLATE_DIRS = (

            os.path.join(BASE_DIR,  'templates'),

        )


     2-7、关于session的配置    

        SESSION_EXPIRE_AT_BROWSER_CLOSE = True    #关闭浏览器时session自动过期

        SESSION_COOKIE_AGE = 60*120         #设置浏览器cookie过期时间,60秒*120  


    3、使用:步骤大概分为:创建项目、创建应用、配置规则

        常用命令:      

        django-admin.py startproject project_name    #创建项目

        python manage.py startapp app_name        #在项目中创建应用

        python manage.py syncdb              #创建(同步)数据库(Django1.9中已弃用)

        python manage.py makemigrations          

        python manage.py migrate             #这两条命令效果等于syncdb

        python manage.py createsuperuser          #创建管理员账户

       python manage.py runserver 0.0.0.0:8000      #启动服务,绑定IP:PORT


        3-1、创建项目:

            3-1-1、手动创建一个目录,如:mkdir /project

            3-1-2、进入该目录创建一个项目,执行django-admin.py startproject 项目名称

                如:django-admin.py startproject P1

        3-2、创建应用:

            3-2-1、进入项目目录,如:cd /project/P1

            3-2-2、执行django-admin.py startapp 应用名称 

                如:django-admin.py startapp app01

        3-3、配置规则:

            3-3-1、修改项目的urls.py,定义URL访问规则(路由规则)

            3-3-2、修改应用的views.py,定义URL的回调函数

         3-4、启动django

        

     Django具体各个部分的配置和使用请继续往下看。


    Django的配置        

    一、Django路由系统

      说明:Django中每一个请求的url必须有一个相应的函数来处理,当请求到达时会根据urls.py文件配置的规则从上往下匹配,匹配一条则不再往下匹配。

      配置文件:urls.py

      配置方式:

        1、静态路由:一个url对应一个views中的函数。

            例:url(r'^index/$', views.index),

        2、动态路由:多个url对应一个views中的函数,此处的url多为正则匹配。

            例:url(r'^index/(.*)/$', views.index),

        3、默认路由:当此条规则之上的所有规则都没有匹配上的时候,它会最终匹配所有。一般用于处理请求地址不存在的情况。

            例:url(r'.*', views.warn),

        4、分类路由:当一个项目有多个app的时候,根据不同的app对路由规则进行一次分类。那个app的请求就由那个app的urls来处理。

            例:url(r'^app01/',include('app01.urls')), #将所有以app01/开头的url请求交给app01目录下的urls.py来处理。

           实现分类路由需要事先做两个操作:

            1、在应用目录(app01)下新建一个urls.py文件。可以直接把项目下的urls.py拷贝过去,然后手动修改内容,在这里面配置的就是app01应用的所有路由规则。

            2、修改项目目录下的urls.py文件,首先导入include方法(from django.conf.urls import include),然后配置路由分类规则,多个应用则重复这两步操作。


    二、Django中间件

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

      配置文件:settings.py

      配置方式:

        MIDDLEWARE_CLASSES = (这里面配置的都是中间件)

      中间件可以自定义,自定义的意义在于可以在每个请求达到或返回的时候做出一些自定义的处理操作。比如日志记录、IP限制等。

      但是,这里不做描述。


    三、Django缓存

      说明:缓存的意义就是缓存(听上去好像是废话,不过Django的缓存功能不常用)。

      1、配置(settings.py中加入)

    CACHES = {

        'default': {

            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',#使用文件缓存

            'LOCATION': os.path.join(BASE_DIR, 'cache'),    #文件名为cache

            'TIMEOUT': 600,    #缓存超时时间为600秒

            'OPTIONS': {

                'MAX_ENTRIES': 1000    #最大缓存条目数为1000

            }

        }

    } 

      2、应用

    from django.shortcuts import render, HttpResponse

    from django.views.decorators.cache import cache_page

     

    @cache_page(60 * 15)    #以装饰器的形式配置,在哪个函数上面,就缓存哪个函数return的数据

    def func(request):

        return HttpResponse('xxx')


    四、cookie和session

       说明:cookie是一个字符串,保存于客户端(浏览器)本地(根据cookie类型的不同可保存在内存,也可保存在硬盘)。

          session保存在服务器端,存储与客户端会话的所有信息。

       在Django中的用处:

        1、用于判断用户是否已登录

        2、根据不同的用户返回不同的内容

       工作原理:

        当客户端(浏览器)访问服务器时,服务器会为本次会话创建一个Seesion,同时生成一个唯一的SessionID,用该SessionID为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,也就是保存在Cookie中,用户提交请求时,会同时将这一SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

       用法:

        1、request.session['username'] = username    #往session中存储一个值(key,value的方式存储)

         2、request.session.get('username')    #根据key从session中获取一个值

         3、del request.session['username']    #根据key从session中删除一个值


    五、模板

     说明:Django中的模板其实就是一个嵌套着各种模板标签的html页面。模板也有自己的语言,语言在模板中以模板标签的形式存在。当用户访问一个页面的时候,Django会读取views中定义的模板,然后将Model中获取的数据插入到模板中,最后将渲染完成的页面返回给用户。

     使用:

        一、模板语言

         1、变量

         {{ 变量名 }}    #两个大括号中定义的是一个变量,变量的值一般是由后台views中以同样的名称来返回赋值。


          2、for循环

          {% for item in item_list %}    #item_list是一个列表,值是由后台views中以同样的名称来返回赋值。

            <p>` item `</p>

          {% endfor %}


         3、if判断

          {% if ordered_warranty %}      #ordered_warranty是一个变量,值是由后台views中以同样的名称来返回赋值。

               html code

           {% else %} 

              html code

           {% endif %}


         4、模板继承:当多个页面需要使用同样的主题样式,只是局部内容不一样时,可以使用模板的继承特性。

          母板:{% block title %}    #title是自定义的一个block名称

             这中间是不希望被继承的html code

            {% endblock %}

          子板:{% extends "base.html" %}  #在子板页面的最顶部配置,base.html是母板的名称 

            {% block title %}    #title是母板中定义的block名称

               这中间是不继承于母版 而是自己自定义的html code

               {% endblock %}

          另类继承方法:{% include 'some.html' %}   #将some.html中的所有内容加载到当前标签的位置 

        

      二、自定义simple_tag(需要在settings.py注册当前app,不然django无法找到自定义的simple_tag)

        1、在app中创建templatetags模块

        2、在templatetags模块中创建tag.py (tag为自定义的名称)   

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    from django import template
    from django.utils.safestring import mark_safe
    from django.template.base import resolve_variable,Node,TemplateSyntaxError
    
    register = template.Library()
    
    @register.simple_tag
    def my_simple_time(v1,v2,v3):    
        return v1+v2+v3
    
    @register.simple_tag
    def my_input(id,arg):
        result = "<input type='text', id='%s' class='%s'>"%(id,arg,)
        return mark_safe(result)

       3、在html中导入之前创建的tag.py(注意导入时文件名不要加.py)  

    {% load tag %}

       4、使用simple_tag,根据tag.py中定义的函数的要求传入参数

    {% my_simple_time 1 2 3 %}
    {% my_input 'id' 'hide' %}

       5、完整的html例子

    {% load tag %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>{{ name }}</h1>
        {% my_simple_time 1 2 3 %}
        {% my_input 'id' 'hide' %}
    </body>
    </html>

     

      三、模板的执行  

    from django.shortcuts import render,HttpResponse
    def index(request):
        item_list2 = ['a','b','c']
        return render(request,'index.html',{'item_list':item_list2})
        #index.html是模板文件,'item_list'是模板文件中定义的变量名称,item_list2是变量的赋值,如果有多个变量需要赋值,则用,逗号隔开,(以字典的形式来给前端页面的变量赋值)。
    
     def warn(request):
         HttpResponse('Page not found')    #直接返回一个字符串


    六、Form和Model

       由于这俩哥们内容比较多同时非常重要,将另起一篇博文来介绍。


    博客的部分内容和思路整理自武沛齐的博客

关键字