内容回顾:    

1. jQuery
        - 选择
        - 操作
        - 事件
    2. Http协议
        -
    3. Django框架
        版本:1.11
        创建:
            django-admin startprojcet xxx
            cd xxx
            python manage.py startapp app01
            
            python manage.py runserver 127.0.0.1:8000
            

今日内容:
    1. 请求生命周期
    2. 主机管理
        - 路由系统
        - 视图函数
        - ORM(操作数据库)
        - 模板
    

内容详细:
    1. 请求生命周期
        - 网站本质:socket
            
            服务端(网站):
                1. 先启动并监听:80端口
            
                3. 获取请求信息:
                    获取请求中的URL
                    
                    根据URL在已经写好的路由关系中进行匹配:
                        [
                            /login/      login
                            /index/      index
                        ]
                    
                    def login(request):
                
                        请求头
                        请求体
                        
                        处理请求
                        
                        
                        return
                            响应内容:
                                响应头\r\n\r\n<!DOCTYPE html><html lang="zh-cn">。。。</html>
                                
                        网站只能看到相应体,在network中可以看到响应头,服务器在给浏览器点东西,相当于令牌之类的
                        下次知道你是你。
                        请求,响应成对出现
                        重定向,服务器将内容发送到浏览器,浏览器在去。
                        本质给浏览器字符串,服务器的html文件就是个模版
                        
                        
                    断开
            
            客户端(浏览器):
                https://www.cnblogs.com/news/
                
                2. 发送请求
                    - 连接:www.cnblogs.com:80
                    - 发送数据:
                        GET:
                            GET /news/?page=1&xx=11 http1.1\r\n
                            host:www.cnblogs.com\r\n
                            Accept-Encoding:gzip, deflate, br\r\n
                            User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
                            \r\n\r\n
                        POST:
                            POST /news/?page=1&xx=11 http1.1\r\n
                            host:www.cnblogs.com\r\n
                            Accept-Encoding:gzip, deflate, br\r\n
                            User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
                            \r\n\r\n
                            name=alex&pwd=123
                            
                            post可以两个位置都有数据,2选一
                3. 接收响应内容
                    响应头悄悄写到浏览器
                    响应体在浏览器上展示
                    
                    
                    
                    断开
            
    2. 主机管理:部门管理
        static静态文件夹,里面有自己的js,css,img便于分类,再创建plugins文件夹,放入外部引用的插件,比如bootstrap
        
        - 创建procjet和app
        - 修改配置文件:
            1. 配置
                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',
                ]
                
            2. 模板路径
            
                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',
                            ],
                        },
                    },
                ]
                
            3. 静态文件目录
            
                STATICFILES_DIRS = (
                    os.path.join(BASE_DIR,'static'),
                )
                
        - 写代码:
            urls.py
                from app01 import views
                
                urlpatterns = [
                    # url(r'^admin/', admin.site.urls),
                    url(r'^login/', views.login),
                    url(r'^index/', views.index),
                ]
            
            views.py
                
                def login(request):
                    if  request.method == "GET": # 请求方法
                        request.GET
                    else:
                        
                        request.GET   # URL中取值
                        request.POST  # 请求体取值
                        
                        return HttpResponse('...')
                        return redirect('...')
                        return render(request,'模板文件路径',{'k':'v'})
                
                    return HttpResponse('欢迎登录')
                    
                def index(request):
                    return HttpResponse('欢迎登录')
        
        
        - 创建用户表
            models.py
                from django.db import models

                class UserInfo(models.Model):
                    id = models.AutoField(primary_key=True)   #自增主键
                    user = models.CharField(max_length=32)      #vchar模式,有办法设置成char模式
                    pwd = models.CharField(max_length=64)      
            
            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"   #两种都好使,但是第一种功能比较全。
                ]

            MySQL
                settings.py
                
                    DATABASES = {
                        'default': {
                            'ENGINE': 'django.db.backends.mysql',
                            'NAME':'数据库名称', # 记得自己先去创建数据库
                            'USER': 'root',
                            'PASSWORD': 'xxx',
                            'HOST': '127.0.0.1',
                            'PORT': 3306,
                        }
                    }
                
                procjet.procjet.__init__.py
                
                    不要用默认mysqldb,换成pymysql连接数据库
                
                    import pymysql
                    pymysql.install_as_MySQLdb()
            SQLlite:
                settings.py
                    DATABASES = {
                    'default': {
                        'ENGINE': 'django.db.backends.sqlite3',
                        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
                    }
                }
            
            执行命令:创建数据库表
                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')
            
            
            
    3. 知识点
    
        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('编辑')
                    
                
                # 方式二:
                     \d 表示数字,$表示结束 +表示一个或多个
                    # /example_edit/123/111/
                    url(r'^example_edit/(\d+)/(\d+)/$', views.example_edit),
                    
                    
                    def example_edit(request,nid,xid):
                        print(nid,xid)
                        return HttpResponse('编辑')
            
            
            ###     在 url(r'^host_edit/(\d+)/$', views2.host_edit), 的情况下,
                            <form class="form-inline" action="/host_edit/{{ id }}/" method="post"> {#要想访问函数,必须路径一致所以将变量id传进来#},要有/
                            

            
                # 方式三:
                
                    # /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. 路由分发
                    s19day17/urls.pyt
                        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),
                        ]
            
            欠:
                name
                namespace
                
                
        2. 视图函数
            def example_edit(request,nid,xid):
                request.method
                request.GET
                request.POST
                
                return HttpResponse('文本')
                return redirect('url')
                # 打开模板,读取数据到内存
                # {'k1':'v1'},对模板中的特殊字符进行“渲染”
                # 生成不含特殊标签(已经被替换完毕)的字符串
                如果{}字典当中是字符串,可以用“”转换,否则容易报错
                return render(request,'模板路径',{'k1':'v1'})
            
        
        3. 模板语言
            
            a. 单值
                
                {{ msg }}
                
            b. 索引 .
            
            c. 循环
                
            d. 判断
            
            e. 母板
                <!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;
                        头部菜单
                    </div>
                    <div>
                        <div style="float: left;width: 20%;background-color: #dddddd;height: 500px;">
                            菜单
                        </div>
                        <div style="float: left;width: 80%">
                            {% block content %} {% endblock %}
                        </div>
                    </div>

                    {% block js %} {% endblock %}
                </body>
                </html>
                
            
            
                
                
                {% extends "layout.html" %}


                 {% block content %}

                    <h1>编辑部门</h1>
                    <form method="post">
                        <div class="form-group">
                            <label for="t1">部门名称</label>
                            <input id="t1" type="text" class="form-control"  name="title" value="{{ obj.title }}">
                        </div>
                        <input type="submit" value="修改"  class="btn btn-default">
                    </form>

                {% endblock %}


                 {% block js %}
                    <script></script>
                {% endblock %}
            
            
            欠:模板中函数
                - simple_tag
                - filter
                - inlustion_tag
                
            
        4. 补充:FK
            增加列的时候,需要指定值,否则为空的话会报错。
            foreign key 会自动在后面价格_id
            
            depart = models.ForeignKey(to='Department',to_field='id',default=1)
            关联Department的id字段和自己。

posted on 2018-04-06 11:01  睡觉的阿狸  阅读(122)  评论(0编辑  收藏  举报