• 【django基础】


    一、MTV模型

    Django的MTV分别代表:

           Model(模型):负责业务对象与数据库的对象(ORM)

           Template(模版):负责如何把页面展示给用户

           View(视图):负责业务逻辑,并在适当的时候调用Model和Template

           此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

    二、django基本命令

    • 下载安装django

    pip3 install django
    • 创建一个django project

    django-admin.py startproject mysite

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

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

    python manage.py startapp blog

    • 启动django项目

    python manage.py runserver 8080

    三、请求的生命周期

    网站的本质是socket

    服务端(网站)

                    1. 先启动并监听:80端口
                
                    3. 获取请求信息:
                        获取请求中的URL
                        
                        根据URL在已经写好的路由关系中进行匹配:
                            [
                                /login/      login
                                /index/      index
                            ]
                        

       def login(request): 请求头 请求体 处理请求 return 响应内容: 响应头
    <!DOCTYPE html><html lang="zh-cn">。。。</html> 断开

    客户端(浏览器)

                    2. 发送请求
                        - 连接:www.cnblogs.com:80
                        - 发送数据:
                            GET:
                                GET /news/?page=1&xx=11 http1.1
    
                                host:www.cnblogs.com
    
                                Accept-Encoding:gzip, deflate, br
    
                                User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
                                
    
    
                            POST:
                                POST /news/?page=1&xx=11 http1.1
    
                                host:www.cnblogs.com
    
                                Accept-Encoding:gzip, deflate, br
    
                                User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
                                
    
    
                                name=alex&pwd=123
                    4. 接收响应内容
                        响应头写到浏览器
                        响应体在浏览器上展示
                        
                        断开

     

    四、主机管理案例

    1、创建project及app

    django-admin.py startproject mysite   #创建project
    python manage.py startapp app01   #创建app
    python manage.py runserver    #启动

    2、修改配置文件

    • settings.py
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',      #添加app01
    ]
    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',
    ]

    TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] #添加模板路径 , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
    #数据库
    DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }

    补充

    DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'dbname',
        'USER': 'root',
        'PASSWORD': 'xxx',
        'HOST': '',
        'PORT': '',
        }
    }
    
    # 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
      
    # 如下设置放置的与project同名的配置的 __init__.py文件中
      
    import pymysql
    pymysql.install_as_MySQLdb() 
    mysql
    #静态文件目录
    STATIC_URL = '/static/'
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'),
    )
    • 代码详情

    文件路径

    """
    Django settings for day16 project.
    
    Generated by 'django-admin startproject' using Django 1.11.4.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/1.11/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/1.11/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = 'l))&0*l6$aja*lcq8=0-s9u4byl2%alzfsgdxs_&3_qre&=mvw'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',
    ]
    
    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',
    ]
    
    ROOT_URLCONF = 'day16.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = 'day16.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/1.11/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/1.11/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/1.11/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'),
    )
    settings.py
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^login/',views.login),
        url(r'^index/',views.index),
        url(r'^parts/',views.parts),
        url(r'^part_add/',views.part_add),
        url(r'^part_del/',views.part_del),
        url(r'^part_edit/',views.part_edit),
    ]
    urls.py
    from django.db import models
    
    # Create your models here.
    from django.db import models
    
    class UserInfo(models.Model):
        id = models.AutoField(primary_key=True)
        user = models.CharField(max_length=32)
        pwd = models.CharField(max_length=64)
        age = models.IntegerField()
    
    
    class Department(models.Model):
        id = models.AutoField(primary_key=True)
        title = models.CharField(max_length=32)
    models.py
    #创建数据库表
                    python3 manage.py makemigrations
                    python3 manage.py migrate
    from django.shortcuts import render,HttpResponse,redirect
    
    # Create your views here.
    
    from app01 import models
    # def test(request):
    #     # #查询所有用户信息
    #     # user_list = models.UserInfo.objects.all()
    #     # for obj in user_list:
    #     #     print(obj,obj.id,obj.user,obj.pwd)
    #     #
    #     # return HttpResponse('123')
    #     #
    #     # user_list = models.UserInfo.objects.filter(user='alex',pwd='123').all
    #     # print(user_list)
    #     #
    #     # user = models.UserInfo.objects.filter(user='alex',pwd='123').first()
    #     # print(user,user.id,user.user,user.pwd)
    #     return HttpResponse('123')
    
    def login(request):
        if request.method == "GET":
            #打开login.html文件
            #找到特殊标记{{msg}}
            #并将第三个参数中字典总的对应值替换
            #将替换完毕的字符串发送给用户浏览器
            return render(request,"login.html",{'msg':''})
        else:
            #去请求体中获取数据
            username1 = request.POST.get("username")
            password1 = request.POST.get("password")
            print(username1,password1)
    
            userinfo = models.UserInfo.objects.filter(user=username1,pwd=password1).first()
            print(userinfo)
    
            if userinfo:
                # return redirect('http://www.baidu.com')
                return redirect('/index/')
            else:
                return render(request,'login.html',{'msg':'用户名或密码错误'})
    
            # if user == "alex" and pwd == "123":
            #     #在响应头中设置,location:http://www.baidu.com,无响应体
            #     return redirect('http://www.baidu.com')
            #     #return redirect('/index/')
            # else:
            #     return render(request,'login.html',{'msg':'用户名或密码错误'})
    def index(request):
        return render(request,'index.html')
    
    def parts(request):
    
        depart_list = models.Department.objects.all()
    
        return render(request,'parts.html',{'depart_list':depart_list})
    
    def part_add(request):
        if request.method == 'GET':
            return render(request,'part_add.html')
        else:
            ti = request.POST.get('title')
    
            models.Department.objects.create(title=ti)
    
            return redirect('/parts/')
    
    def part_del(request):
        nid = request.GET.get('nid')
        models.Department.objects.filter(id=nid).delete()
        return redirect('/parts/')
    
    def part_edit(request):
        if request.method == 'GET':
            nid = request.GET.get('nid')
            obj = models.Department.objects.filter(id=nid).first()
    
            if not obj:
                return HttpResponse('写错了,返回吧')
            return render(request,'part_edit.html',{'obj':obj})
        else:
            nid = request.GET.get('nid')
            title = request.POST.get('title')
    
            models.Department.objects.filter(id=nid).update(title=title)
            return redirect('/parts')
    views.py

    创建如下目录,并将bootstrap导入到plugins下

    templates文件夹下创建html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>欢迎登录</h1>
        <ul>
            <li><a href="/parts/">业务线管理</a></li>
        </ul>
    </body>
    </html>
    index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css">
    </head>
    <body>
    
    <div style=" 500px;margin: 0 auto;margin-top: 80px;">
        <form class="form-horizontal" action="/login/" method="post">
            <div class="form-group">
                <label for="n1" class="col-sm-2 control-label">用户名</label>
                <div class="col-sm-10">
                    <input id="n1" type="text" name="username" class="form-control" placeholder="用户名">
                </div>
            </div>
            <div class="form-group">
                <label for="n2" class="col-sm-2 control-label">密码</label>
                <div class="col-sm-10">
                    <input id="n2" type="password" name="password" class="form-control" placeholder="密码">
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <input type="submit" value="登 录" class="btn btn-primary">{{ msg }}
                </div>
            </div>
        </form>
    </div>
    </body>
    </html>
    login.py
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css">
    </head>
    <body>
        <div class="container">
            <h1>添加部门</h1>
            <form action="" method="POST">
                <input type="text" name="title">
                <input type="submit" vlaue="添加">
            </form>
        </div>
    
    </body>
    </html>
    part_add.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css">
    </head>
    <body>
        <div class="container">
            <h1>编辑部门</h1>
            <form action="" method="post">
                <div class="form-group">
                    <label for="t1">部门名称</label>
                    <input type="text" id="'t1" class="form-control" name="title" vlaue="{{ obj.title }}">
                </div>
                <input type="submit" value="修改" class="btn btn-default">
            </form>
        </div>
    </body>
    </html>
    part_edit.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css">
    </head>
    <body>
        <div class="container">
            <h1>部门列表</h1>
            <div style="margin: 5px 0">
                <a href="/part_add/" class="btn btn-success"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span>添加</a>
            </div>
            <table class="table table-bordered">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>部门</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody>
                    {% for obj in depart_list %}
                        <tr>
                            <td>{{ obj.id }}</td>
                            <td>{{ obj.title }}</td>
                            <td>
                                <a href="/part_edit/?nid={{ obj.id }}" class="btn btn-info"><span class="glyphicon glyphicon-cog" aria-hidden="true"></span>编辑</a>
                                <a href="/part_del/?nid={{ obj.id }}" class="btn btn-danger"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span>删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
        </div>
    
    </body>
    </html>
    parts.html
    • 数据库截图如下

    department表

    userinfo表

    • 项目截图

    登录界面

    登录成功跳转index

    parts界面

    五、知识补充

    1、数据库相关

    执行命令:创建数据库表

                    python3 manage.py makemigrations
                    python3 manage.py migrate

    对应关系

    类      ->      表
    对象    ->      行

    数据库操作

                表级别:
                    from django.db import models
    
                    # 类对象数据库的表
                    class UserInfo(models.Model):
                        # 字段对应数据库中列
                        id = models.AutoField(primary_key=True) # 创建id列,自增,int,主键
                        user = models.CharField(max_length=32,null=False)  # varchar(32)
                        pwd = models.CharField(max_length=64)
                        age = models.IntegerField() # int类型
                        
                    class Department(models.Model):
                        """
                        部门表
                        """
                        id = models.AutoField(primary_key=True)
                        title = models.CharField(max_length=32)
                
                    
                    python manage.py makemigrations
                    python manage.py migrate 
                    
                行:
                    增加:
                        
                        models.UserInfo.objects.create(user="alex",pwd='123',age=18)
                        
                        dic = {'user':'alex','pwd':'123',"age":18 }
                        models.UserInfo.objects.create(**dic)
                        
                    删除:
                        
                        models.UserInfo.objects.filter(id=12,name='alex').delete()
                        
                        dic = {'user':'alex','pwd':'123',"age":18 }
                        models.UserInfo.objects.filter(**dic).delete()
                        
                    修改:
                        
                        
                        models.UserInfo.objects.filter(id=12,name='alex').update(user='11111',pwd='xxxx')
                        models.UserInfo.objects.filter(**{...}).update(**{...})
                        
                        
                    查看:
                        
                        # [obj,obj,obj,....]
                        v = models.UserInfo.objects.all()
                        # [obj,obj,obj,....]
                        v = models.UserInfo.objects.filter(....)
                        # obj
                        models.UserInfo.objects.filter(....).first()
                        
                        # 获取一个对象;无、多都会报错
                        models.UserInfo.objects.get(id=1,name='alex')

    2、路由系统

            1. 路由系统 
                
                a. url添加起始和终止符
                    url(r'^example/$', views.example),
                    url(r'^example/add/$', views.example_add),
                
                b. 传参,推荐使用二和三
                    
                    
                    
                    # 方式一
                    
                        # http://127.0.0.1:8000/example_edit/?nid=11&xid=1
                        
                        url(r'^example_edit/$', views.example_edit)
                        
                        def example_edit(request):
                            nid = request.GET.get('nid')
                            xid = request.GET.get('xid')
                            print(nid,xid)
                            return HttpResponse('编辑')
                        
                    
                    # 方式二:
                    
                        # /example_edit/123/111/
                        url(r'^example_edit/(d+)/(d+)/$', views.example_edit),
                        
                        
                        def example_edit(request,nid,xid):
                            print(nid,xid)
                            return HttpResponse('编辑')
                
                
                    # 方式三:
                    
                        # /example_edit/123/111/
                        url(r'^example_edit/(?P<xid>d+)/(?P<nid>d+)/$', views.example_edit),
                        
                        
                        def example_edit(request,nid,xid):
                            print(nid,xid)
                            return HttpResponse('编辑')
                
                c. 路由分发 
                
              from django.conf.urls import url,include
    s19day17
    /urls.py url(r'^cmdb/', include('cmdb.urls')) url(r'^openstack/', include('openstack.urls')) cmdb/urls.py from django.conf.urls import url,include from cmdb import views urlpatterns = [ url(r'^host/$', views.host), ] openstack/urls.py from django.conf.urls import url,include from openstack import views urlpatterns = [ url(r'^host/$', views.host), ]

    3、视图函数

                def example_edit(request,nid,xid):
                    request.method 
                    request.GET
                    request.POST 
                    
                    return HttpResponse('文本')
                    return redirect('url')
                    # 打开模板,读取数据到内存
                    # {'k1':'v1'},对模板中的特殊字符进行“渲染”
                    # 生成不含特殊标签(已经被替换完毕)的字符串
                    return render(request,'模板路径',{'k1':'v1'})

            def keng(request):
               return render(request,'keng.html',{'k1':123,'k2':"alex"})

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>{{ k1 }}</h1>
    
        <script>
            alert("{{ k2 }}");
        </script>
    </body>
    </html>

    4、模板语言

    tpl.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
            <h1>{{ "asdfasdf"|upper }}</h1>
    
        <h1>{{ k1 }}</h1>    #单值
        <h1>{{ k2.2 }}</h1>    #索引
        {% for item in k2 %}      #循环
            <a href="#">{{ item }}</a>
        {% endfor %}
    
        <h1>{{ k3.age }}</h1>
    
        {% for k,v in k3.items %}
            <a href="#">{{ k }}  {{ v }}</a>
        {% endfor %}
    
        {% if k1 == 123 %}    #if判断
            <h1>下课</h1>
        {% else %}
            <h1>放学</h1>
        {% endif %}
    
    </body>
    </html>

    views.py

    def tpl(request):
        data_dict = {
            'k1': 123123,
            'k2':[11,22,33,'alex'],
            'k3':{'name':'李杰','age':18}
        }
        return render(request, 'tpl.html', data_dict)

    母版

    {% block css %} 程序块{% endblock %} 其余地方为母版内容,继承
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css">
        <style>
            body{
                margin: 0;
            }
        </style>
        {% block css %} {% endblock %}
    </head>
    <body>
        <div style="height: 48px;background-color: #1b6d85">
            头部菜单
        </div>
        <div>
            <div style="float: left; 20%;background-color: #dddddd;height: 500px;">
                菜单
            </div>
            <div style="float: left; 80%">
                {% block content %} {% endblock %}
            </div>
        </div>
    
        {% block js %} {% endblock %}
    </body>
    </html>
  • 相关阅读:
    weblogic启动失败java.lang.NullPointerException
    weblogic应用加载不上
    easychm生成帮助文件时出现的目录导航乱码问题
    An error report file with more information is saved as hs_err_pid2756.log
    js parseint
    修改myelipse中部署路径deploy location内容的方法
    FusionCharts制作实时刷新图
    关于Jquery,js脚本加载执行先后顺序的一些事
    jeesite+mysql,数据导入出现问题。
    AMD Radeon HD 7650A显卡问题
  • 原文地址:https://www.cnblogs.com/smallmars/p/8259358.html
Copyright © 2020-2023  润新知