zoukankan      html  css  js  c++  java
  • 第6模块 web框架口述题

    状态码如200 OK,以3位数字和原因 成。数字中的 一位指定了响应 别,后两位无分 。响应 别有以下5种。

    重定向:
    客户端像服务器端发送请求,服务器告诉客户端你去重定向(状态码302,响应头location=客户端绝路路径),客户端继续像服务器发送请求(请求地址已经成重定向的地址),服务器端给客户端响应

    转发
    客户端像服务器端发送请求,服务器将请求转发到服务器内部,在响应给客户端

    重定向
    response.setStatus(302) response.setHeader("location","/项目名称/资源"); 或者简写成 response.sendRedirect("/项目名称/资源")

    转发
    getRequestDispatcher(“/资源”) .forward(request.response)

    区别:
    什么时候使用重定向,什么时候使用转发

    • 转发地址栏不变(一次请求),重定向地址栏变化(两次)
    • 转发不用写项目名称,重定向需要编写项目名称
    • 转发可以使用request对象传递值,重定向不可以使用request对象传递值
    • 转发只能在服务器的内部进行操作,重定向可以定向到任何的资源

    配置静态文件夹2步

    1、在项目文件夹下建'static‘文件夹

    2、在setiings文件下添加别名路径

    STATICFILES_DIRS=[

    • os.path.join(BASE_DIR,"STATICS')  
    • ]    
    • //添加静态文件夹     

      STATIC_URL = 'static'    //别名

     

     

    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',
                ],
            },
        },
    ]
    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',
    ],
    },
    },
    ]

    django解释器配置(用于打开下载的项目,或打开以前做的项目 ,不配置会报错。)

    1、配置项目解释器
    file--settings--project Interpreter
    project Interpreter: (此处选择安装python的路径)

    2、到pycharm 右上角选择项目 edit configuration 选中 run browser

    <p>{{ text|truncatechars:9 }}</p>  #截取9个字符
    <p>{{ text|truncatewords:3 }}</p>  #截取3个单词
    {{forloop.counter}} 从1 开始计数,写在for 循环里才有用
    {{forloop.counter0}}  从0 开始计数,写在for 循环里才有用
    {% for person in person_list %}
        <p>{{ forloop.counter0 }} {{ person.name }} {{ person.age }}</p>
        {% empty %}      ##嵌套在for 循环里,相当于python 里的else作用
            <p>列表为空</p> 
    {% endfor %}

     django将模型转为mysql数据库中的表

    在book下的models.py中创建模型:
    
    from django.db import models
    # Create your models here.
    
    class Book(models.Model):
         id=models.AutoField(primary_key=True)
         title=models.CharField(max_length=32)
         state=models.BooleanField()
         pub_date=models.DateField()
         price=models.DecimalField(max_digits=8,decimal_places=2)
         publish=models.CharField(max_length=32)
    
    
    settings配置
    
    若想将模型转为mysql数据库中的表,需要在settings中配置:
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'bms',           # 要连接的数据库,连接前需要创建好
            'USER':'root',        # 连接数据库的用户名
            'PASSWORD':'',        # 连接数据库的密码
            'HOST':'127.0.0.1',       # 连接主机,默认本级
            'PORT':3306            #  端口 默认3306
        }
    }

    #迁移之前必须先手动创建好'bms'库
    ##在settings.py 中 检查INSTALLED_APPS中查找INSTALLED_APS中 “app01”(应用文件夹名,没有就添加,否则会报错)

    注意1:NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动
    创建 USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。
    然后,启动项目,会报错:no module named MySQLdb 。这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb
    对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的init,在里面写入:
    import pymysql
    pymysql.install_as_MySQLdb()
    
    
    

    最后通过两条数据库迁移命令即可在指定的数据库中创建表terminal中输入:

    
    
    python manage.py makemigrations
    python manage.py migrate
     

     Django设置调试models输出的SQL语句 

    django1.3在shell下,调试models变得更为简单了,不用像之前的版本,手工去调用django query,才能打印出之前的代码是执行的什么SQL语句.
    
    1.3开始只需在settings.py里,配置如下logging即可:
    
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }

    Django的API操作mysql中常用的语句

    【背景】

    增/删/改/查 如何操作数据库

    导入数据库的模型

    In [23]: from blog.models import People
     

    【增加记录】--三种方法

    方法一: 直接使用数据模对象的create函数

    In [24]: People.objects.create(name='shuaige')    

    Out[24]: <People: People object>

    注意:创建成功返回对象地址

    方法二:

    In [6]: record = People(name='choubaguai')    
    In [7]: record.save()
     

    方法三:

    In [9]: record = People()  
    In [10]: record.name ='andy'
    In [11]: record.save()
     

    【删除记录】--找对对象,使用delete() 进行删除

    第一找出你要删除的对象集合(id大于2的)

    In [19]: r_d = People.objects.filter(id__gt =2)
     

    使用delete对象将其删除

    In [20]: r_d.delete()
    Out[20]: (3, {'blog.People': 3})
     

    将返回珊瑚的条目数

    【改记录】-先找出来,在将对象属性重新赋值

    (将id=1的名字改成andyliu)

    In [21]: People.objects.values_list()
    Out[21]: [(1, 'liudehua'), (2, 'zhangxueyou')]
    In [22]: r_m = People.objects.get(id=1)
    In [23]: r_m.name = 'andyliu'
    In [24]: r_m.save()
    In [25]: People.objects.values_list()  
    Out[25]: [(1, 'andyliu'), (2, 'zhangxueyou')]
     

    【查】 这就相当于mysql中sql语句中的select语句,其中有很多字语句进行限制查询

    1 获取所有记录对象

    all_record = People.objects.all()        

    如果要获取对象值,需要先取出某一个对象,然后取出对象中的属性

    In [32]: for record in all_record:
       ....:     print(record.id)
       ....:     print(record.name)
       ....:     
    1
    andyliu
    2
    zhangxueyou
     

    2 获取某个域为指定值的对象

    In [11]: r_p = People.objects.get(name='zhangxueyou')       
    In [12]: r_p.id
    Out[12]: 2
     

    注意: 这个用法不常用,如果要用,你一定要保证,你查找的一定存在这样的一个记录,且必须是唯一,不然会报错哦

    3 类似mysql中where进行的条件查询使用filter函数

    第一: 整数的范围比较查询()

    将id大于1的对象找出来,并以值列表的形式进行返回

    In [15]: People.objects.filter(id__gt=1).values_list()
    Out[15]: [(2, 'zhangxueyou'), (6, 'andyliu')]
     
    gt 大于
    gte 大于等于
    lt 小于
    lte 小于等于
    ne 不等于
    in(也可以是其他数据类型) 位于给定列表中: People.objects.filter(id__in=[1, 3, 4]) 返回一个 polls 列表(ID 值分别是 1或3或4).
    In [16]: People.objects.filter(name__in=['andyliu','zhangxueyou']) 
    Out[16]: [<People: People object>, <People: People object>, <People: People object>]
     

    4 多过滤条件查询,有一种方法是,多次使用filter函数即可

    In [17]: People.objects.filter(id__gt=1).filter(name='andyliu')          
    Out[17]: [<People: People object>]
    In [18]: People.objects.filter(id__gt=1).filter(name='andyliku')
    Out[18]: []
     

    5 查找到的对象数据(即符合条件的记录的数目)

    In [25]: People.objects.count()

    Out[25]: 3

    等于:

    In [26]: People.objects.all().count()  

    Out[26]: 3

    符合条件的长度

    In [24]: People.objects.filter(name='andyliu').count() 
    Out[24]: 2
     

    6 order_by()函数,进行升序/降序

    -负数表示要进行降序排序

    In [14]: p = People.objects.order_by('-id')
    In [15]: for i in p:                       
        print(i.id)
       ....:     
    6
    2
    1
     

    7 in list

    In [15]:
    Person.objects.filter(id__in = [1,2]).values_list()
    Out[15]: [(1,
    'name1', 22), (2, 'name2', 22)]
     

    8 not in list(这里没有直接的not in list) 但是可以使用exclude,除外来等价

    In [16]:
    Person.objects.exclude(id__in = [1,2]).values_list()
    Out[16]: [(3,
    'name3', 22), (4, 'name3', 22)]
     

    9. 包含关键字的(集合链式查询)

    表中的所有数据:

    In [20]: Person.objects.values_list()
    Out[20]: [(1, 'name1', 23), (2, 'name2', 22), (3, 'name3', 22), (4, 'name3', 22)]
     

    name这个field包含name的关键字的record记录

    In [21]: Person.objects.filter(name__contains="name").values_list()
    Out[21]: [(1, 'name1', 23), (2, 'name2', 22), (3, 'name3', 22), (4, 'name3', 22)]
     

    name这个field包含name的关键字的record记录并且年龄age字段不能等于23的! 使用链式查询

    In [23]: Person.objects.filter(name__contains="name").exclude(age=23).values_list()
    Out[23]: [(2, 'name2', 22), (3, 'name3', 22), (4, 'name3', 22)]
     

    以上需求用filter进行等价操作,取出22岁的

    In [24]: Person.objects.filter(name__contains="name").filter(age=22).values_list()
    Out[24]: [(2, 'name2', 22), (3, 'name3', 22), (4, 'name3',
     

    10 对象索引,类似python 列表中的切片

    In [29]: Person.objects.all()[1:3]

    Out[29]: [<Person: Person object>, <Person: Person object>]

    In [30]: Person.objects.all()[1:3].values_list()

    Out[30]: [(2, 'name2', 22), (3, 'name3', 22)]

    但是不知持负索引(会报错),如

    Person.objects.all()[-1]

    取代的方法:使用reverse方法来解决



  • 相关阅读:
    MySQL--自增列持久化问题
    MySQL--”自然键”和”代理键”优缺点
    MySQL--REPLACE INTO更新自增列值引发的异常
    MySQL Inception--原理和注意事项
    MySQL Inception--安装
    MySQL--关联更新
    MySQL--Delete语句别名+LIMIT
    MySQL Disk--SSD 特性
    BootStrap简介
    BootStrap简单使用
  • 原文地址:https://www.cnblogs.com/anzhangjun/p/10019791.html
Copyright © 2011-2022 走看看