Django-01

Web框架

1.Web应⽤程序处理流程  :

      

2.Web框架的意义
            1.⽤于搭建Web应⽤程序
            2.免去不同Web应⽤相同代码部分的重复编写,只需关⼼Web应⽤核⼼的业务逻辑实现
    3.Web应⽤程序的本质
            1.接收并解析HTTP请求,获取具体的请求信息
            2.处理本次HTTP请求,即完成本次请求的业务逻辑处理
            3.构造并返回处理结果——HTTP响应
            4.如何学习Web框架说明:

          

Django框架介绍

1.简介和特点
        1.简介:
            是⽤python语⾔写的开源web开发框架,并遵循MVC设计。
            Django的 主要⽬的是简便、快速的开发数据库驱动的⽹站。
        2.特点
            重量级的Web框架,功能⻬全
            遵循MVC设计
    2.设计模式
    MVC
        MVC,其核⼼思想是分⼯、解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。
        M 全拼为Model,主要封装对数据库层的访问,对数据库中的数据进⾏增、删、改、查操作。
        V 全拼为View,⽤于封装结果,⽣成⻚⾯展示的html内容。
        C 全拼为Controller,⽤于接收请求,处理业务逻辑,与Model和 View交互,返回结果。
    MVT
        M 全拼为Model,与MVC中的M 功能相同,负责和数据库交互,进⾏数据处理。
        V 全拼为View,与MVC中的C 功能相同,接收请求,进⾏业务处理,返回应答。
        T 全拼为Template,与MVC中的V 功能相同,负责封装构造要返回的html。
 3.相关⽂档
        官⽅⽹站 https://www.djangoproject.com/
      GitHub源码 https://github.com/ django/ django
      中⽂版⽂档 https://yiyibooks.cn/xx/Django_1.11.6/index.html

搭建Django⼯程
    1.安装Django框架

创建虚拟环境 mkvirtualenv 虚拟环境名字 -p python3
        安装框架 pip install django==1.11.11

2.创建Django⼯程⽬录

命令
            django-admin startproject ⼯程名称
        步骤
            进⼊要创建⼯程的⽬录

django-admin startproject demo
        启动测试服务器 python manage.py runserver

3.创建Django⼦应⽤
        说明
            Django的视图编写是放在⼦应⽤中的。
        命令
            python manage.py startapp ⼦应⽤名称
        步骤
            进⼊到项⽬⽬录中
            python manage.py startapp users

安装⼦应⽤

INSTALLED_APPS = [
         ' django.contrib.admin' ,
         ' django.contrib.auth' ,
         ' django.contrib.contenttypes' ,
         ' django.contrib.sessions' ,
         ' django.contrib.messages' ,
         ' django.contrib.staticfiles' ,
         'users.apps.UsersConfig', # 安装users应⽤
                ]

4.创建视图并定义路由
        1.总路由⼊⼝ ROOT_URLCONF = 'demo.urls'
        2.总路由定义     demo.urls

urlpatterns = [
             url(r'^admin/', admin.site.urls),
             # 将 users应⽤中的所有路由包含进来
             url(r'^users/', include('users.urls')),]

3.⼦路由定义       Users.urls

urlpatterns = [
             # url(r'^路径$', views.视图),
             url(r'^index/$', views.index),
                  ]

4.视图定义     users.views

def index(request):
"""
定义django函数视图
:param request: 传⼊到函数视图的请求对象
:return: 响应对象
"""
    return HttpResponse('hello world')

配置⽂件、静态⽂件、路由说明
    1.settings.py配置⽂件说明
    2.静态⽂件使⽤
        1.配置静态⽂件的访问
            # 静态⽂件访问的路由
            STATIC_URL = '/static/'
            # 配置静态⽂件加载⽬录
            STATICFILES_DIRS = [
             os.path.join(BASE_DIR, 'static_files')
                      ]
        2.准备静态⽂件1
            项⽬根路径/静态⽂件夹/静态⽂件
            项⽬根路径/static_files/index.html
            http://127.0.0.1:8000/static/index.html
        3.准备静态⽂件2
            项⽬根路径/static_files/goods/detail.html
            http://127.0.0.1:8000/static/goods/index.html
    3.路由的使⽤
        1.Django解析路由的流程 :

    

2.路由定义位置
                1.总路由+⼦路由
                    总路由 url(r'^users/', include('users.urls')),
                    ⼦路由 url(r'^index/$', views.index),
                2.总路由 url(r'^users/index/$', views.index),
                3.⼦路由
                        总路由 url(r'^', include('users.urls')),
                        ⼦路由 url(r'^users/index/$', views.index),
    3.路由解析的顺序
        1.urlpatterns⾥⾯的路由解析的顺序
                ⾃上⽽下
            urlpatterns = [
             # url(r'^路径$', views.视图),
             url(r'^index/$', views.index, name= 'index'),
             # 以下代码演示路由⾃上⽽下匹配规则
             # url(r'^say', views.say), # 这个会拦截下⾯的路由
             # url(r'^sayhello', views.say_hello),
             url(r'^say$', views.say), # 定义路由要指明开始和结束
             url(r'^sayhello$', views.say_hello),
                    ]
        2.结论 ⼦路由需要有开始和结尾

4.路由命名空间和reverse反解析
        1.定义命名空间
            url(r'^users/', include('users.urls', namespace= 'users')),
            url(r'^index/$', views.index, name= 'index'),
        2.使⽤反向解析 'users/index/'
            url = reverse('users:index')
    5.路径以斜线结尾说明
        1.正则匹配路由结尾带斜线,如果⽤户输⼊的URL路径没有斜线,当找不到该路由时 浏览器会⾃动的重定向到带斜线的路由
        2.正则匹配路由结尾不带斜线,如果⽤户输⼊的URL路径有斜线,直接报404错误

请求对象:
    1.利⽤HTTP协议向服务器传参的⼏种途径
        请求⾏中的路径
        查询字符串
        请求体
        请求头
    2.使⽤正则提取URL中参数
        1.位置参数
            # url(r'^weather1/([a-z]+)/(\d{4})/$', views.weather),
            def weather1(request, city, year):
             """读取正则中的组提取的参数"""
             print( 'city=%s' % city)
             print( 'year=%s' % year)
             return HttpResponse('OK')
        2.关键字参数
            # url(r'^weather2/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather2),
            def weather2(request, year, city):
             """读取正则中的关键字提取的参数"""
             print( 'city=%s' % city)
             print( 'year=%s' % year)
             return HttpResponse('OK')
    3.提取查询字符串参数
            1.需求 提取问号后⾯的查询字符串
                    /weather3/beijing/2018/?a=10&b=20&a=30
            2.属性 GET
                    request.GET
                    返回QueryDict类型的对象
            3.QueryDict类型
                    可以存储⼀键⼀值和⼀键多值
                    提供get()⽅法 读取⼀键⼀值
                    提供getlist()⽅法 读取⼀键多值
            4.代码演练
                    # /weather3/beijing/2018/?a=10&b=20&a=30
                    def weather3(request, year, city):
                     """提取查询字符串参数"""
                     print( 'city=%s' % city)
                     print( 'year=%s' % year)
                     a = request.GET.get('a')
                     b = request.GET.get('b')
                     a_list = request.GET.getlist( 'a')
                     print( a,b,a_list)
                     return HttpResponse('OK')
    4.提取请求体中的参数
            1.提取请求体中的表单数据
                1.属性
                    POST
                    request.POST
                    返回QueryDict类型的对象
                2.代码演练

 # url(r'^get_body_form/$', views.get_body_form),
def get_body_form(request):
  """演示获取请求体中的表单"""
    a = request.POST.get('a')
    b = request.POST.get('b')
    alist = request.POST.getlist( 'a')
    print(a)
    print(b)
    print( alist)
    return HttpResponse('OK')

2.提取请求体中的⾮表单数据
                1.属性
                    body
                    request.body
                2.代码演练

# url(r'^get_body_json/$', views.get_body_json),
# {"a": 1, "b": 2}
def get_body_json(request):
"""演示获取请求体中的⾮表单数据"""
    print(request.META['CONTENT_TYPE'])
    print(request.method, request.path)
    json_str = request.body
    json_str = json_str.decode()
    req_data = json.loads( json_str)
    print(req_data['a'])
    print(req_data['b'])
    return HttpResponse('OK')

5.提取请求头中的信息
            1.提取⽅案
            2.代码实现 print(request.META['CONTENT_TYPE'])
    6.其他请求报⽂信息
            print(request.method, request.path)

响应对象:
    1.HttpResponse
     1.常规⽤法
          # HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
          # 注意点:响应体参数是必传的
          return HttpResponse('OK', content_type= 'text/html', status= 200)
       2.⾃定义响应头
              # 创建响应对象
             response = HttpResponse('OK', content_type= 'text/html', status= 200)
              # ⾃定义响应头:键值对;⾃定义响应头键 Itcast, 值 Python
                 response[' subject' ] = 'Python'
                 return response
     2.JsonResponse

# GET /response_json/ (表示⽤户向我们索取json)
def response_json(request):
"""响应json数据"""
    # 准备字典: json字符串的key,需要双引号
    json_dict = {"name": " python" , "age": 25}
    # 默认会设置状态码
    # 默认会将数据类型设置为 Content-Type: application/json
    # 默认会将json字典转json字符串, 再将json字符串转⼆进制响应给⽤户
    return JsonResponse( json_dict)

3.重定向
                 # GET /response_redirect/
               def response_redirect(request):
                       """重定向"""
               # 需求:重定向到users应⽤的index视图
               # 使⽤最原始的⽅式
               # return redirect('/users/index/')
               # 使⽤反向解析实现重定向
                    return redirect(reverse('users:index'))
       4.render 响应模板数据的,后续模板时会使⽤响应模板数据的,后续模板时会使⽤

相关源码连接:

github,技术交流,欢迎指教

django 基础框架学习 (一)的更多相关文章

  1. django 基础框架学习 (三)

    Django框架基础-03数据库新增数据    1.save⽅法        >>> from datetime import date        >>> f ...

  2. django 基础框架学习 (二)

    Django框架基础-02 Django缓存cookie 1.说明        当我们服务器在响应数据的同时,希望写⼊⼀些缓存数据到客户端        我们可以选择在响应的同时,将要写⼊到客户端的 ...

  3. WEB框架-Django框架学习-预备知识

    今日份整理,终于开始整个阶段学习的后期了,今日开始学习Django的框架,加油,你是最胖的! 1.web基础知识 1.1 web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是 ...

  4. Python学习(二十六)—— Django基础一

    转载自:http://www.cnblogs.com/liwenzhou/p/8258992.html 一.Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的 ...

  5. Django 基础 web框架本质

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

  6. day 52 Django基础一之web框架的本质

    Django基础一之web框架的本质   django第一天 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于D ...

  7. Web框架之Django_01初识(三大主流web框架、Django安装、Django项目创建方式及其相关配置、Django基础三件套:HttpResponse、render、redirect)

    摘要: Web框架概述 Django简介 Django项目创建 Django基础必备三件套(HttpResponse.render.redirect) 一.Web框架概述: Python三大主流Web ...

  8. django基础(web框架,http协议,django安装)

    学习Django之前我们先来看什么是OSI七层模型: 应用层 表示层       应用层(五层模型中把这三层合成一个应用层) http协议 会话层 传输层                  提供端口对 ...

  9. Web框架django基础篇

    基本配置及学习  路由(Urls).视图(Views).模板(Template).Model(ORM). 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开 ...

随机推荐

  1. mysql高可用集群——MHA架构

    目录1.下载2.搭建mha 2.1 系统配置 2.2 架构 2.3 添加ssh公钥信任 2.4 安装mha节点 2.5 manager配置文件 2.6 检查 2.7 启动manager进程 2.8 碰 ...

  2. postgresql 主从复制并切换

    1 环境 192.168.19.145 Kylin 3.3 mysqlhq  9.5.2  psql_master192.168.19.227 Kylin 3.3 mysql3    9.5.2  p ...

  3. Rails通过页面Debug

    <%= debug(headers) %>--在视图中显示伴随请求的头部信息 <%= debug(params) %>--在视图中显示请求中的参数 <%= debug(a ...

  4. CreateThread demo

    #include "stdafx.h"#include<windows.h>#include<strsafe.h>//win2003SDK必须安装 要不无此 ...

  5. java之控制多幅图片

    package xxj.thread0904; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFra ...

  6. cookie禁用后重定向跳转时session的跟踪

  7. JAVA基础知识总结11(异常)

    异常: 就是不正常.程序在运行时出现的不正常情况.其实就是程序中出现的问题.这个问题按照面向对象思想进行描述,并封装成了对象.因为问题的产生有产生的原因.有问题的名称.有问题的描述等多个属性信息存在. ...

  8. php二维数组排序方法(array_multisort,usort)

    一维数组排序可以使用asort.ksort等一些方法进程排序,相对来说比较简单.二维数组的排序怎么实现呢?使用array_multisort和usort可以实现 例如像下面的数组: $users = ...

  9. set源码之心得

    C++的STL很强大,强大到我只愿慵懒地去使用而不知其所以然.直到李师问我,我的回答被李师否定,我方才意识到自己是多么地浅陋.希望自己有空抽时间把STL源码给研究一下,化为自己真正可以掌控的力量. s ...

  10. C++ 私有构造函数的作用

    很多情况下要求当前的程序中只有一个object.例如一个程序只有一个和数据库的连接,只有一个鼠标的object.通常我们都将构造函数的声明置于public区段,假如我们将 其放入private区段中会 ...