zoukankan      html  css  js  c++  java
  • Django框架

    静态文件配置

    我们将html文件默认都放在templates文件夹下

    将网站所使用的静态文件默认都放在static下

    静态文件

    写好之后不会自动动态改变的文件资源,比如我们写好的css文件、js文件、图片文件、第三方框架文件,我们默认将所有的静态文件都放在一个static文件夹内,

    django是不会自动创建static文件夹的,需要我们自己在的django目录下手动创建该文件夹
    一般情况下我们在 static文件夹内还会做进一步的划分处理,拿来就可以直接使用:

    static
       ├─ bootstrap 前端已经写好了的能够直接调用的文件
       ├─  js  写好的js文件
       ├─  css 写好的css文件
       ├─  img 用到的img文件
       └─  其他第三方文件资源
    

    之所以在浏览器中输入url 能够看到对应的资源,是因为开发者早已提前在后端开设了该资源的访问接口
    如果访问不到资源,说明后端没有开设该资源的接口

    http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
    

    settings.py 静态文件配置

    # 如果想要访问静态文件就必须以static开头
    STATIC_URL = '/static/'  # 接口前缀 类似于访问静态文件的令牌
    """
    例如有此路径:
    <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    /static/ 前面这个就是接口前缀
    bootstrap-3.3.7-dist/js/bootstrap.min.js 后面的就是路径
    书写了接口前缀之后 就拥有了访问下列列表中所有文件夹内部资源的权限
    然后会以从上往下的顺序在列表里面依次查找,直到拿到路径返回给页面
    都没有才会报错
    
    """
    # 静态文件配置
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static') # 这个static就是真正的静态文件夹路径
        os.path.join(BASE_DIR, 'static1')
        os.path.join(BASE_DIR, 'static2')
    ]
    
    

    静态文件接口前缀动态解析

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>动态解析</title>
        {% load static %}
        <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
        <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
    </head>
    <body>
    
    </body>
    </html>
    

    form表单知识回顾

    form表单默认使用的是get请求数据

    form表单action参数:控制后端提交的路径

    • 1.不写:默认朝当前所在的url(页面地址)提交数据
    • 2.全写:指名道姓 https://www.baidu.com
    • 3.只写后缀 :/index/

    form表单method参数:默认是get请求,可以改成post请求

    在前期使用django提交post请求的时候需要先去配置文件中注释掉一行代码

    image-20210314215356759

    request对象方法初识

    request.method  # 返回字符串<cass'str'>
    	 获取当前请求的请求方法,并且结果是一个纯大写的字符串类型
    request.POST  # 直接看成是字典即可
    	 获取用户提交post请求过来的基本数据(不包含文件)
       request.POST.get() 
    		  get方法只获取列表最后一个元素
       request.POST.getlist() 
    	      getlist方法会直接获取整个列表,不管里面有几个元素
    
    request,GET # 直接看成是字典即可
         获取用户提交的get请求数据(url问号后面的数据)
       request.GET.get()
    		  get方法只获取列表最后一个元素
       request.GET.getlist()
    		  getlist方法会直接获取整个列表,不管里面有几个元素
    
    request.FILES  # 直接看成是字典即可
    	 获取用户上传的文件数据  
       request.FILES.get()
    		  get方法只获取列表最后一个元素
       request.FILES.getlist()
    		  getlist方法会直接获取整个列表,不管里面有几个元素   
    '''
    get请求携带的数据是有大小限制的大概好像只有4KB左右
    而post请求则没有限制
    
    form表单如果需要携带文件数据 那么要添加参数
     <form action="" method="post" enctype="multipart/form-data">
        	
    '''
    

    视图函数书写格式

    # 书写格式(层级复杂不推荐)
    def login(request):
        """
        get请求和post请求应该有不同的处理机制
        :param request:请求相关的数据对象里面有很多简易的方法
        :return:
        """
        print(type( request.method)) # 返回请求方式并且是纯大写的字符串类型<class str>
        if request.method == 'GET':
            # 返回给浏览器一个登陆界面
            return render(request,'login.html')
    	elif request.method == 'POST':
        	return Httpresponse("收到了宝贝")
    
    # 标准书写格式(层级精简推荐)    
    def login(request):
    	if request.method == 'POST':
    		return Httpresponse("收到了宝贝")
    	return render(request,'login.html')
    

    pycharm链接数据库

    Database工具栏

    07e79e4473abd8f9bb5bef9aa2644a2

    下载对应驱动即可

    24ba128f01911c4f4dfe88473d33273

    django链接数据库(MySQL)

    1.在settings.py配置文件修改配置

    """django默认使用自带的sqlite3"""
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db666',  # 数据库名称 一定要事先创建好才能指定
            'HOST':'127.0.0.1', # 数据库IP,暂用本地回环地址
            'PORT':3306,     # 数据库端口
            'USER':'root',   # 数据库用户名
            'PASSWORD':'123', # 数据库密码
            'CHARSET':'utf8'  # 指定字符编码
        }
    }	
    

    2.在项目文件夹或者应用文件夹内的__init__.py文件中书写固定的代码

    django默认用的是mysqldb模块链接MySQL
    但是该模块的兼容性不好,需要手动改为用pymysql模块链接

    import pymysql
    pymysql.install_as_MySQLdb()
    

    django ORM简介

    """
    ORM:对象关系映射
    作用:目的就是为了能够让不懂SQL语句的人通过python面向对象的知识点也能够轻松自如的操作数据库
    缺陷:封装程度太高,有时候sql语句的效率偏低,需要自己写SQL语句
    """
    类 ---------------->>> 表
    对象 --------------->>> 表里面的数据
    对象点属性 ---------->>> 字段对应的值
    
    

    ORM实操

    1. 模型类需要写在应用下的models.py文件中

    class User(models.Model):        
        # id int primary key auto_increment
        id = models.AutoField(primary_key=True)
        # name varchar(32)
        name = models.CharField(max_length=32)  # CharField必须要加max_length参数,不加报错
        # age int
        age = models.IntegerField()
    

    2. 数据库迁移命令(***非常重要***)

    ********************************************************************
    *    1.将数据库修改操作先记录到小本本上(对应应用下的migrations文件夹)    
    *		  python3 manage.py makemigrations                 
    *    								 
    *    2.真正的执行数据库迁移操作                                      
    *		  python3 manage.py migrate    	                  
    *  # 只要动了models.py中跟数据库相关的代码就必须重新执行上述两条命令   
    ********************************************************************
    
    首次执行数据库迁移命令会发生的事儿

    882fff2a209191b14eab042bf4c7d15

    数据库同步命令(了解)

    """
    数据库里面已经有一些表,我们如何通过django orm操作?
    	1.照着数据库表字段自己在models.py
    		数据需要自己二次同步
    	2.django提供的反向同步
    """
    1.先执行数据库迁移命令 完成链接
    	python manage.py makemigrations
    2.查看代码
    	python manage.py inspectdb
      	
        class Userinfo(models.Model):
            id = models.IntegerField(blank=True, null=True)
            name = models.CharField(max_length=32, blank=True, null=True)
            pwd = models.IntegerField(blank=True, null=True)
    
            class Meta:
                managed = False
                db_table = 'userinfo'
    

    3. 针对主键字段

    class User1(models.Model):
        # 由于一张表中必须要有一个主键字段,并且一般情况下都叫id字段
        # 如果你不指定主键 那么orm会自动帮你创建一个名为id的主键字段
        # 如果你想让主键字段名不叫id 叫uid、sid、pid等则需要自己手动指定
        username = models.CharField(max_length=32)
    

    4. 字段的增删改查

    # 字段的增加
    1.可以在终端内直接给出默认值
    2.该字段可以为空
      pwd = models.IntegerField('密码',null=True)  
    3.直接给字段设置默认值
      is_delete = models.IntegerField(default=0)  
    
    # 字段的修改
    直接修改代码,然后执行数据库迁移的两条命令即可
    
    # 字段的删除
    直接注释对应的字段,然后执行数据库迁移的两条命令即可
    执行完毕之后字段对应的数据也都没有了
    """
    在操作modles.py的时候一定要细心
     千万不要手误注释掉重要的字段
     执行迁移命令之前一定要检查下自己写的代码
     建议:离开你的计算机之后一定要锁屏
    """
    

    5. 数据的增删改查

    # 1.查询数据
    # select * from user where name=username;
    user_obj = models.User.objects.filter(name=username).first()
    
    # 2.添加数据
    # insert into user(name,pwd) values(username,password);
    models.User.objects.create(name=username,pwd=password)
    
    # 3.查询所有的数据
    # select * from user;
    models.User.objects.all()  # [obj1,obj2,obj3,obj4]
    
    # 4.修改数据
    models.User.objects.filter(id=edit_id).update(name=username,pwd=password)
    edit_obj.name = username
    edit_obj.pwd = password
    edit_obj.save()
    
    # 5.删除数据
    models.User.objects.filter(id=delete_id).delete()
    

    ORM创建外键关系

    1.表与表之间的关系
    一对多
    一对一
    多对多
    2.表关系的判断
    换位思考

    ORM针对外键字段的创建位置

    一对多:推荐建在多的一方

    一对一:建在任何一方都可以,但是推荐建在查询频率较高的表中

    多对多:1.自己建表
    2.建在任何一方都可以,但是推荐建在查询频率较高的表中

    class Book(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=8,decimal_places=2)  # 总共8位 小数占2位
        # 出版社外键
        publish = models.ForeignKey(to='Publish')  # 默认就是主键
        """自动在外键字段后面加_id后缀"""
        # 作者外键
        authors = models.ManyToManyField(to='Author')  # 自动帮你创建书籍和作者的第三张表
        """虚拟字段不会在表中实例化出来  而是告诉ORM创建第三张关系表"""
    
    class Publish(models.Model):
        title = models.CharField(max_length=32)
        email = models.EmailField()
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField()
        author_detail = models.OneToOneField(to='AuthorDetail')
        """自动在外键字段后面加_id后缀"""
    
    class AuthorDetail(models.Model):
        phone = models.BigIntegerField()
        addr = models.CharField(max_length=128)
    

    django请求生命周期流程图

    一、Django请求的生命周期的含义

    Django请求的生命周期是指:当用户在浏览器上输入url到用户看到网页的这个时间段内,Django后台所发生的事情。

    二、Django请求的生命周期图解及流程

    Django生命周期图

    首先,用户在浏览器中输入url,发送一个GET方法的request请求。

    Django中封装了socket的WSGi服务器,监听端口接受这个request 请求,

    再进行解析封装,然后传送到中间件中,这个request请求再依次经过中间件,

    对请求进行校验或处理,再传输到路由系统中进行路由分发,匹配相对应的视图函数(FBV),

    再将request请求传输到views中的这个视图函数中,进行业务逻辑的处理,

    调用modles模型层中表对象,通过orm拿到数据库(DB)的数据。

    同时拿到templates中相应的模板进行渲染,然后将这个封装了模板response响应传输到中间键中,

    依次进行处理,最后通过WSGi再进行封装处理,响应给浏览器展示给用户。

    从来就没有正确的选择,我们只不过是要努力奋斗,使当初的选择变得正确。
  • 相关阅读:
    Quartz_理解2
    Quartz_理解1
    Java监控常用工具 .
    DB2函数大全
    cvs上传复制项目
    PLSQL DEVELOPER 使用的一些技巧【转】
    webservice_模拟报文测试
    Myeclipse插件将wsdl生成java客户端代码
    利用 UltraEdit 重新排版 XML 结构数据
    uoj164. 【清华集训2015】V 统计
  • 原文地址:https://www.cnblogs.com/gfeng/p/14543864.html
Copyright © 2011-2022 走看看