当前位置 博文首页 > weixin_41997073的博客:【星海出品】Django入门

    weixin_41997073的博客:【星海出品】Django入门

    作者:[db:作者] 时间:2021-07-15 15:38

    **Django简述 **

    blog/
    ├── blog
    │ ├── init.py #空文件
    │ ├── settings.py #管理项目的配置信息
    │ ├── urls.py #路由,声明请求url的映射关系
    │ └── wsgi.py #python程序和web服务器的通信协议
    └── manage.py #一个命令行工具,用来和Django项目进行交互

    Django采用MVC架构设计的开源的WEB快速开发框架。
    优点: 能够快速开发,自带ORM、Template、Form、Auth核心组件
    MVC设计模式 实用的管理后台Admin 简洁的url设计 周边插件丰富
    缺点:框架重、同步阻塞
    所以Django的设计目标就是一款大而全,便于企业快速开发项目的框架,因此企业应用较广。

    最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发。以下内容简要介绍了如何使用 Django 实现一个数据库驱动的 Web 应用。

    Django 无需数据库就可以使用,它提供了 对象关系映射器 通过此技术,你可以使用 Python 代码来描述数据库结构。

    你可以使用强大的 数据-模型语句 来描述你的数据模型,这解决了数年以来在数据库模式中的难题。以下是一个简明的例子:

    运行 Django 命令行工具来创建数据库表:
    $ python manage.py migrate
    这个 migrate 命令查找你所有可用的模型并将在数据库中创建那些不存在的表,还可提供了可选的 丰富 schema 控制。
    接下来,你就可以使用一套便捷而丰富的 Python API 访问你的数据。这些 API 是即时创建的,而不用显式的生成代码:

    MVC简述

    我们先对 MVC 设计模式进行介绍,它是 Web 设计模式的经典之作,MTV 模式也是在它的基础上衍生而来。
    MVC 是 Model-View-Controller 的缩写,其中每个单词都有其不同的含义:
    1.Modle 代表数据存储层,是对数据表的定义和数据的增删改查;
    2.View 代表视图层,是系统前端显示部分,它负责显示什么和如何进行显示;
    3.Controller 代表控制层,负责根据从 View 层输入的指令来检索 Model 层的数据,并在该层编写代码产生结果并输出。

    MVC 设计模式的请求与响应过程描述如下:
    用户通过浏览器向服务器发起 request 请求,Controller 层接受请求后,同时向
    Model 层和 View 发送指令; Mole 层根据指令与数据库交互并选择相应业务数据,然后将数据发送给 Controller 层;
    View 层接收到 Controller 的指令后,加载用户请求的页面,并将此页面发送给 Controller 层; Controller 层接收到 Model 层和 View 层的数据后,将它们组织成响应格式发送给浏览器,浏览器通过解析后把页面展示出来。

    MVC 的 3 层之间紧密相连,但又相互独立,每一层的修改都不会影响其它层,每一层都提供了各自独立的接口供其它层调用,MVC 的设计模式降低了代码之间的耦合性(即关联性),增加了模块的可重用性,这就是 MVC 的设计模式。

    WSGI(Web Server Gateway Interface) 概述

    主要规定了服务器端和应用程序间的接口。

    #返回文本例子
    from wsgiref.simple_server import make_server,demo_app
    ip ='127.0.0.1'
    port = 9999
    server = make_server(ip,port,demo_app)# demo_app应用程序,可调用
    server.serve_forever() # server.handle_request()执行一次
    

    WSGI框架库往往可以看做增强的更加复杂的Application。
    WSGI服务器作用 监听HTTP服务端口(TCPServer,默认端口80) 接收浏览器端的HTTP请求并解析封装成environ环境数据
    负责调用应用程序,将environ数据和start_response方法两个实参传入给Application
    将应用程序响应的正文封装成HTTP响应报文返回浏览器端

    #返回网页的例子
    from wsgiref.simple_server import make_server
    
    def application(environ,start_response):
    	status ='200 OK'
    	headers = [('Content-Type','text/html;charset=utf-8')]
    	start_response(status,headers)
    	#返回可迭代对象
    	html ='<h1>welcome to xinghai bo ke</h1>'.encode("utf-8")
    	return [html]
    
    ip ='127.0.0.1'
    port = 9999
    server = make_server(ip,port,application)
    server.serve_forever()# server.handle_request()一次
    

    测试命令

    $ curl-I http://192.168.142.1:9999/xxx?id=5
    $ curl-X POST http://192.168.142.1:9999/yyy-d'{"x":2}'
    
    

    ORM模式 Django 与 数据库

    Web 开发中对数据库的操作是必不可少的,然而每种数据库的操作方式以及用法不尽相同。由于 Django 中 ORM的存在,为我们操作不同种类的数据库提供了统一的方法,ORM 适配了多种常用的关系型数据库,例如
    PostgreSQL、MySQL、Oracle、Sqlite3 等。

    其实模型类本质上属于一个 Python 类,只不过在 Django 中称之为做模型类 ,它是由 django.db.models.Model 派生出的子类,在 Django 中模型类是数据交互的接口,一个模型类代表数据库中的一张数据表,模型类中每一个类属性都代表数据表中的一个字段。

    ORM 的增删改查称为 CURD 操作,下面列举几个常用语句:
    UserInfo.objects.all()#查询表中的所有记录
    UserInfo.objects.filter(name_contains=‘j’)#查询表中name含有“j”的所有记录,被使用较多
    UserInfo.objects.get(name=“john”)#有且只有一个查询结果,如果超出一个或者没有,则抛出异常
    UserInfo.objects.get(name=“john”).delete()#删除名字为john的记录
    UserInfo.objects.get(name=“john”).update(name=‘TOM’)#更新数据表的name为TOM

    ORM 模块确实有诸多的优势,比如:
    使用该模块只需要面向对象编程,不需要面向数据库编写代码,对数据库的操作转换为对类属性和方法的操作,不用我们编写各种数据库的 SQL 语句。
    实现数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异化,不在关注不同数据库内部的操作细节,通过简单更改配置就可以实现数据库的更换而无需更改代码。

    Django安装

    $ pip install django==<version>
    $ django-admin--version
    $ django-admin
    

    Django 原生的auth功能

    新建一张 auth_user 用户表,并为此表添加一个新用户 user。首先用如下方式引入 auth模块的 User 方法:

    from django.contrib.auth.models import User
    user=User.objects.create_user(username='test1',password='123456',email='test@123')
    save()#调用该方法保存数据 
    user.set_password(password='12345abc')#会对原密码进行修改
    

    还有认证服务等诸多原生函数,可自行查看

    Django 项目的创建

    $ django-admin startproject blog .
    #该命令代表创建了Django的初始文件,最后的 . 代表当前目录
    $tree
    ├─ manage.py
    └─ blog
        ├─  settings.py
        ├─  urls.py
        ├─  wsgi.py
        └─  __init__.py
    

    manage.py:本项目管理的命令行工具。应用创建、数据库迁移等都使用它完成
    blog/settings.py:本项目的核心配置文件。数据库、中间件、模板等
    blog/urls.py:URL路径映射配置。项目初始,只配置了/admin的路由。
    blog/wsgi:定义WSGI接口信息。部署用,一般无需改动。

    创建一个名为app_demo的应用, 在终端项目目录下执行
    python3 manage.py startapp app_demo
    
    ├── app_demo
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    

    app_demo目录结构 admin:对应应用后台管理配置文件
    apps:对应应用的配置文件
    models:数据模块,用于设计数据库等
    tests:编写测试脚本
    views:视图层,直接和浏览器进行交互
    每次新建一个App我们需要将其在settings.py文件中的INSTALLED_APPS里进行注册,这样程序才能够找到这个服务

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app_demo', # 注册新创建的应用app
    ]
    
    #打开app_demo目录下的view.py, 开始coding 配置第一个网页
    from django.http import HttpResponse
    
    def msg(request, name, age):
        return HttpResponse('My name is ' + name , 'hello world')
    

    这里需要配置两个URL,第一个是blog总项目的映射,admin是给定的官方默认保留的管理员管理连接。
    hello指的是访问网页的 url 对应的视图函数
    例如:http://localhost:8000/hello/
    对应的是 app_demo.urls <指向了建立新项目的urls文件,追踪下面的视图函数>

    #blog_url
    # 在url中写入URL来进行 前端地址到app_demo,view函数的映射
    # 导入url模块
    from django.conf.urls import url
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        url(r'^hello/$', app_demo.urls)
    ]
    

    代表的是hello开头的导入进来的所有匹配项都直接使用 视图函数 views.hello 渲染返回

    #demo_app_urls
    from django.conf.urls import url
    urlpatterns = [
    	url(r'^$', views.hello)
    ]
    

    在urlpatterns中加入url(‘hello/’, views.hello),第一个元素是匹配的字符串,第二个元素为相对应的视图模块。

    也就是告诉django所有url/hello/ 的请求都是指向了views.hello
    这个视图。hello前不需要加’/’,因为域名的末尾一定会有’/’。其中’^‘为严格前匹配,’,浏览器输入http://localhost:8000/hello/a/b
    也是可以访问view.hello视图

    数据库配置

    使用数据库,需要修改默认的数据库配置。
    在主项目的settings.py下的DATABASES。默认使用的sqlite,修改为mysql。

    DATABASES = {
    	'default': {	
    		'ENGINE':'django.db.backends.mysql',
    		'NAME':'blog',
    		'USER':'xinghai',
    		'PASSWORD':'123456',
    		'HOST':'192.168.0.128',
    		'PORT':'3306',
        }
    }
    
    pip install mysqlclient
    

    创建用户应用

    $ python manage.py startapp user
    

    在这里插入图片描述

    创建应用后,项目根目录下产生一个user目录,有如下文件:
    admin.py:应用后台管理声明文件
    models.py:模型层Model类定义
    views.py:定义URL响应函数或类
    migrations包:数据迁移文件生成目录
    apps.py:应用的信息定义文件

    在blog/settings.py中,增加user应用。
    目的是为了后台管理admin使用,或迁移migrate使用

    INSTALLED_APPS = [
    	'django.contrib.admin',
    	'django.contrib.auth',
    	'django.contrib.contenttypes',
    	'django.contrib.sessions',
    	'django.contrib.messages',
    	'django.contrib.staticfiles',
    	'app_demo',
    	'user',
    ]
    

    建立django与数据库的表联系
    在 /user/models.py 中建立类,对接数据库中的表。
    基础原理见: https://editor.csdn.net/md/?articleId=118181661

    from django.db  import models
    
    class User(models.Model):
        class Meta:
            db_table = 'user'
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=48,null=False)
        email = models.CharField(max_length=64,unique=True,null=False)
        password = models.CharField(max_length=128,null=False)
    
        def __repr__(self):
            return '<user {} {}>'.format(self.id, self.name)
    
        __str__ =__repr__
    

    Django后台管理
    1、创建管理员

    $ manage.py createsuperuser
    Username (leave blank to use'wayne'):admin
    Email address:
    Password:
    Password (again):
    Superuser created successfully.
    

    启动 WEB Server

    python manage.py runserver
    

    后台登录地址
    http://127.0.0.1:8000/admin

    在user应用的admin.py添加

    from django.contrib import admin
    from .modelsimportUser
    # Register your models here.
    admin.site.register(User)#注册
    #user就可以在后台进行增删改了。
    
    
    cs