zoukankan      html  css  js  c++  java
  • day17-django基础

    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
    
    响应内容:
    响应头
    
    <!DOCTYPE html><html lang="zh-cn">。。。</html>


    断开

    客户端(浏览器):
    https://www.cnblogs.com/news/

    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


    3. 接收响应内容
    响应头悄悄写到浏览器
    响应体在浏览器上展示

    断开


    2. 主机管理:部门管理

    - 创建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. 静态文件目录


    静态文件 别名
    STATIC_URL = '/static/'

    物理路径

    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)
    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 (项目名称下面)

    python3 不支持mysqld,但是djaog 默认还是使用mysqldb,所以不要用默认mysqldb,换成pymysql连接数据库

    mysql:
    import
    pymysql pymysql.install_as_MySQLdb()

    执行原生sql 命令

    依赖于models

    obj=models.HostsInfo.objects.raw('select * from ops_hostsinfo')
    return render(request,'test.html',{'obj':obj})



    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):
    """
    部门表
    """
    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').update(user='11111',pwd='xxxx')
    models.UserInfo.objects.filter(**{...}).update(**{...})

    删除:

    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('编辑')


    # 方式二:

    # /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. 路由分发

    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. 循环

    例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:
    <ul>
    {% for athlete in athlete_list %}
        <li>{{ athlete.name }}</li>
    {% endfor %}
    </ul>



    d. 判断

            {# 如果 a1 == a2 则显示 #}
            {% ifequal a1 a2 %}
                <h1>equal!</h1>
            {% else %}
                <h1>not equal!</h1>
            {% endifequal %}
    
    
            {# 如果 a1 != a2 则显示 #}
            {% ifnotequal a1 a2 %}
                <h1>not equal!</h1>
            {% endifnotequal %}
    
    
            {# 如果 a1 == 'word' 则显示 #}
            {% ifequal a1 'word' %}
                <h1>a1=word</h1>
            {% endifequal %}
    
    
            {# 如果 a2 == 55.23 则显示 #}
            {% ifequal a2 55.23 %}
                <h1>a2=55.23</h1>
            {% endifequal %}
    
    
    
    {# 如果 a3 == {{ a4 }} 则显示 #}
            {% ifequal a2 {{ a4 }} %}
                <h1>a2={{ a4 }}</h1>
            {% endifequal %}
    
    
    注意结束使用endifequal或者endifnotequal。
         可以使用 if 标签的“==”比较来代替此标签,如:
    
     {% if a1 == 'a' %}
    
    <h1>a1=a2</h1>
    
    {% endif %}

    案例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    #只循环key
    <p>
        {% for k in user_list.keys %}
            <li>{{ k }}</li>
    {% endfor %}
    </p>
    #只循环values
    <p>
        {% for val in user_list.values %}
            <li>{{ val}}</li>
    {% endfor %}
    </p>
    
    #全都循环出来
    <p>
        {% for k,val in user_list.items %}
            <li>{{ k}}-{{ val }}</li>
    {% endfor %}
    </p>

    模板语言--案例

                        <select name="dep">
    {##这里用到 模板的for循环和if判断 。for循环不介绍了,if 的意思是如果第当前选择的那个部门等于全部部门中,那么加上selected 标签,也就是默认选中标签#}
                            {% for dep_title in dep %}
                                {% ifequal hosts.depart.title dep_title.title %}
                                    <option selected="selected">
                                        {{ hosts.depart.title }}
                                    </option>
                                {% else %}
                                    <option>
                                        {{ dep_title.title }}
                                    </option>
                                {% endifequal %}
    
                            {% endfor %}
                        </select>
    {#                        {  #模板语言的if判断,如果为对应数字 则显示对应样式这个图片#}
                            {% if obj.status.id == 1 %}
                                <span style=""><img src="/static/img/Up.gif">UP</span>
                            {% elif obj.status.id == 2 %}
                                <span style=""><img src="/static/img/Down.gif">DOWN</span>
                            {% elif obj.status.id == 3 %}
                                <span style=""><img src="/static/img/Down.gif">RESTART</span>
                            {% elif obj.status.id == 4 %}
                                <span style=""><img src="/static/img/Down.gif">ERROR</span>
                            {% endif %}


    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;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>
    #这里为引入模板文件
    {% 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
    

     #####未补充笔记

    urls 页面

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/', views.index),
        url(r'^login/', views.login),
    ]

    views页面

    from django.shortcuts import render,redirect
    from django.http import HttpResponse
    # Create your views here.
    import time,datetime
    def index(request):
        #返回首页
        return HttpResponse("index")
    
    def login(request):
        #如果提交方式为GET则返回login.html
        if request.method == "GET":
            return render(request,"login.html")
        elif request.method == "POST":
            u = request.POST.get('username')
            p = request.POST.get('password')
            if u == 'sunkd' and p == 'sunkd':
                #如果密码正确返回首页
                return redirect('/index/')
            else:
                #如果不正确返回登录页面
                return render(request,'login.html')
        else:
            #如果为其他请求也返回首页
            return redirect('/index/')

    前端数据传到后端

    前段多选标签传值到后端(getlist 获取到的是一个字典,前段是一个多选框)

            u = request.POST.get('username')
            p = request.POST.get('password')
            print(u)
            city = request.POST.getlist('city')
            print(city)

    前端上传文件 传输到后端

    因为是上传文件,需要在form表单中加入  
    enctype="multipart/form-data"
    拿的是文件名称
    file=request.FILES.get('filename')
    print(file)

     案例:循环前端过来的文件

            import os
            file=request.FILES.get('filename')
            #创建上传文件夹,可以判断下
            #把上传的文件放到upload 中
            file_path=os.path.join('upload',file.name)
            #打开一个文件 并且写入,chunks 为前端发送,后端接受的块数据
            f = open(file_path,mode="wb")
            for i in file.chunks():
                f.write(i)
            f.close()
    View Code
  • 相关阅读:
    ajax请求传参数复杂对象list,后端springmvc接收参数
    SpringBoot热部署简介
    lucene 初探
    学生管理系统导包
    tomcat加入系统服务+开机自启
    sql like模糊查询的条件拼接
    SSHDemo
    Spring在web开发中的应用
    Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)
    dwz tree组件 取得所选择的值
  • 原文地址:https://www.cnblogs.com/sunkedong/p/8253910.html
Copyright © 2011-2022 走看看