Djangon简介

Djangon简介

MVC与MTV模型

MVC

Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:

MTV

Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:

  • M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
  • T 代表模板 (Template):负责如何把页面展示给用户(html)。
  • V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。

除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:

一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。

python三大主流web框架

​ Django:
​ 大而全 自带的功能特别特别多 类似于航空母舰
​ 有时候过于笨重

Flask
小而精 自带的功能特别特别少 类似于游骑兵
第三方的模块特别特别多,如果将flask第三方模块全部加起来 完全可以超过django
比较依赖于第三方模块

Tornado
异步非阻塞
牛逼到可以开发游戏服务器

A:socket部分
B:路由与视图函数对应关系
C:模板语法

Django:
A用的别人的 wsgiref
B自己写的
C自己写的
Flask
A用的别人的 werkzeug(基于wsgiref)
B自己写的
C用的别人的 jinja2
Tornado
三者全是自己写的

注意事项
1.计算机的名称不能有中文
2.一个pycharm窗口就是一个项目
3.项目名里面尽量不要用中文

Django的下载与基本命令

1、下载Django

  方式一:在命令行输入:pip3 install django

    pip install django==1.11.9 -i http://pypi.hustunique.org/simple 指定版本号,指定国内镜像

​ django版本问题
​ 1.X 2.X 现在市面上用的比较多的还是1.X
​ 推荐你使用1.11.9~1.11.13

  方式二:用pycharm安装

  方式三:用pycharm的Terminal的命令行安装

​ 如何验证django是否安装成功

​ 命令行直接敲django-admin

2、创建一个django project

django-admin.py startproject mysite

当前目录下会生成mysite的工程,目录结构如下:

img

  • manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
  • settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
  • urls.py ----- 负责把URL模式映射到应用程序。

3、在mysite目录下创建应用

python manage.py startapp blog

img

4、启动django项目

python manage.py runserver 8001

这样我们的django就启动起来了!当我们访问:http://127.0.0.1:8080/时就可以看到:

5、创建app

一个django项目就类似于是一所大学,而app就类似于大学里面的学院
django其实就是用来一个个应用的
一个app就相当于一块独立的功能
用户功能
管理功能
django支持任意多个app

如何使用
命令行使用
创建django项目
django-admin startproject mysite
启动django项目
python manage.py runserver
创建应用app
python manage.py startapp app01

注意:
1.新创建的app需要你去settings配置文件中注册
pycharm只会帮你注册第一个你在创建项目的时候写的应用

注意:
1.使用命令行创建django项目 不会自动帮你创建templates文件夹
只能自己创建
2.settings文件中 需要你手动在TEMPLATES写配置
os.path.join(BASE_DIR, 'templates')

pycharm使用

在启动django项目的时候 你一定要确保一个端口只有一个django项目

项目名
跟项目名同名的文件夹
settings.py 暴露给用户的配置文件
urls.py 路由与视图函数对应关系
应用名
migrations文件夹 存放数据库迁移记录的
admin.py django后台管理
apps.py 注册相关
models.py 模型类
tests.py 测试文件
views.py 存放视图函数
templates文件夹 存放html文件
manage.py django入口文件

基于Django实现的一个简单示例

(1)URL控制器

from django.contrib import admin
from django.urls import path


from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index),
]

(2)视图

from django.shortcuts import render

# Create your views here.



def index(request):

    import datetime
    now=datetime.datetime.now()
    ctime=now.strftime("%Y-%m-%d %X")

    return render(request,"index.html",{"ctime":ctime})

(3)模版

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h4>当前时间:{{ ctime }}</h4>

</body>
</html>

Django静态文件配置

静态文件配置
静态文件
网站所用到的
自己写好js
自己写好css
第三方的框架 bootstrap fontwesome sweetalert

通常情况下 网站所用到的静态文件资源 统一都放在static文件夹下
STATIC_URL = '/static/'  # 是访问静态资源的接口前缀
"""只要你想访问静态资源 你就必须以static开头"""
# 手动配置静态文件访问资源
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    # os.path.join(BASE_DIR,'static2'),
]

接口前缀 动态解析
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>

新建一个目录叫:static,我们的css文件,js文件,图片文件都放在这下面

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

mycss.css

h4{
    color:red;
}

myjs.js

$('h4').click(function () {
    $(this).css("color","green");
})

insex.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/mycss.css">
    <script src="/static/jquery-3.3.1.js"></script>

</head>
<body>
<h4>我是红色,点击变绿</h4>
</body>
<script src="/static/myjs.js"></script>
</html>

Django form表单

form表单 action参数可以写的形式
1.不写 默认朝当前地址提交
2.只写后缀/index/
3.写全路径

form表单默认朝后端提交的方式 默认是get请求
    get请求携带参数的方式 是在url后面?
    url?username=admin&password=213213213213213
    缺点
        1.不安全
        2.get请求携带的参数有大小限制(最大不能超过4KB左右)

前期你如果要提交post请求 你就去settings.py文件注释掉一个中间件
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',
    ]

Django request对象及方法

前后端数据交互
如何获取请求方式

    获取post请求携带的数据
        request.POST
       
    获取get请求携带的数据
        request.GET
    get和post在后端获取用户数据的时候 规律是一样的
    <QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
    tank <class 'str'>
    123 <class 'str'>
    request.POST.get('username') 默认只取列列表的最后一个元素
    如果你想将列表完整的取出 你必须用getlist()

Django 处理响应

	from django.shortcuts import render,HttpResponse,redirect
	
	HttpResponse()   #括号内直接跟一个具体的字符串作为响应体,比较直接很简单
    
    render(request, template_name[, context])# 返回html页面 并且可以给该html传值
 
	#结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
    #参数:
           
     #request: 用于生成响应的请求对象。

     #template_name:要使用的模板的完整名称,可选的参数

     #context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在			   渲染模板之前调用它。
    
    redirect  # 重定向
        	  # 既可以是我们自己的路径也可以是网上的路径
    def my_view(request):
    ...
    return redirect('/some/url/')
    
    def my_view(request):
    ...
    return redirect('http://www.baidu.com/') 
    
           
    django返回的都是HttpResponse对象

Django 连接MySQL

#第一步配置文件中配置
                DATABASES = {
                    'default': {
                        'ENGINE': 'django.db.backends.mysql',  # 指定数据库 MySQL postgreSQL
                        'NAME': 'day56',  # 到底使用哪个库
                        'USER':'root',
                        'PASSWORD':'root',
                        'HOST':'127.0.0.1', 
                        'PORT':3306,
                        'CHARSET':'utf8'
                    }
                }
            #第二步 
            #django默认使用的是mysqldb连接数据库  但是该模块不支持了
            #所以你要告诉django不要用mysqldb该用pymysql连接
            #你可以在项目名下面的__init__.py也可以在应用名下面的__init__.py文件中指定
            import pymysql
            pymysql.install_as_MySQLdb()

Django orm简介

orm对象关系映射

    类                   数据库的表
    
    对象                  表的记录
    
    对象获取属性          记录的某个字段对应的值
    
    优点:能够让一个不会数据库操作的人 也能够简单快捷去使用数据库
    
    缺点:由于封装程度太高 可能会导致程序的执行效率偏低
    有时候 结合项目需求 可能需要你手写sql语句

​ 注意事项
​ 1.django的orm不会自动帮你创建库,库需要你自己手动创建
​ 表会自动帮你创建 你只需要书写符合django orm语法的代码即可

#去应用下所在的models.py中书写类

from django.db import models

# Create your models here.
class Userinfo(models.Model):
    # 设置id字段为userinfo表的主键  id int primary key auto_increment
    id = models.AutoField(primary_key=True)  # 在django中 你可以不指定主键字段 django orm会自动给你当前表新建一个名为id的主键字段
    # 设置username字段  username varchar(64)  CharField必须要指定max_length参数
    username = models.CharField(max_length=64)  # 在django orm中 没有char字段  但是django 暴露给用户 可以自定义char字段
    # 设置password字段  password int
    password = models.IntegerField()
#******************************数据库迁移(同步)命令***********************************    
python manage.py makemigrations  # 不会创建表 仅仅是生成一个记录  将你当前的操作记录到一个小本本上(migrations文件夹)

python manage.py migrate  # 将你的orm语句真正的迁移到(同步)到数据库中

只要你在models.py中修改了跟数据库相关的代码  你就必须重新开始执行上面两条命令

	数据操作
        表字段的增删改查
            新增的字段
                1.直接提供默认值 default
                2.设置改字段可以为空 null=True
            注意的是 不要轻易的注释models.py中任何跟数据库相关的代码
            主要是跟数据库相关的代码 你在处理的时候一定要小心谨慎

          数据的增删改查
            数据的查
                get() 
                    1.条件存在的情况下 获取的直接是数据对象本身
                    2.条件不存在的情况下 会直接报错  所以不推荐你使用get方法查询数据
                
                filter()
                    1.条件存在的情况下 获取到的是一个可以看成列表的数据 列表里面放的才是一个个数据对象本身
                    2.条件不存在的情况下  并不会报错 返回的是一个可以看成空列表的数据
                    3.filter括号内可以写多个参数逗号隔开  这多个参数在查询的时候 是and关系
                    4.filter的结果支持索引取值  但是不支持负数  并且不推荐你使用索引  推荐你使用它封装好的方法 first取第一个数据对象
            数据的增
                1.create()
                    1.括号内些关键字参数的形式 创建数据
                    2.该方法会有一个返回值 返回值就是当前对象本身
                2.利用对象点方法的方式(不推荐使用 效率极低 会将每一个字段对应的值全部重写一遍)
                    user_obj = User(username='jason')
                    user_obj.save()  # 将当前对象保存到数据库中
            数据的删除
                    models.Userinfo.objects.filter(pk=delete_id).delete()
                    """说真正的数据是不会被删除的 通常都是给数据设置一个是否删除的标志位"""

Django请求生命周期

  1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端
    请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post,体现在url之中.
  2. url经过Django中的wsgi,再经过Django的中间件,最后url到过路由映射表,在路由中一条一条进行匹配,
    一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配了.
  3. 视图函数根据客户端的请求查询相应的数据.返回给Django,然后Django把客户端想要的数据做为一个字符串返回给客户端.
  4. 客户端浏览器接收到返回的数据,经过渲染后显示给用户.

img

posted @ 2019-10-24 09:06  Thousand_Mesh  阅读(299)  评论(0编辑  收藏  举报