zoukankan      html  css  js  c++  java
  • 路由系统、函数视图、Django的ORM初步

    1.1 伪静态

    伪静态是相对于静态文件来说的,例如https://www.cnblogs.com/hesujian/p/11165818.html

    我们就称之为伪静态,因为他其实不是html静态页面,只是伪装成html静态页面

    伪静态的好处:

      1、美观(传统的问号拼接看起来比较杂乱)

      2、seo(搜索引擎优化技术),搜索引擎比较喜欢收录静态页面,所以大家都做成伪静态去增加收录机会

    1.2 实现伪静态以及路由分发

    既然我们已经用伪静态的url去访问服务器了,那么服务器怎么拿到需要的值

    比如我们把 :http://127.0.0.1:8000/up_student/?id=12

    伪装成  :http://127.0.0.1:8000/up_student/12

    后台接收数据就需要用到路由分发的技术

    路由分发及在后台匹配uri时,通过正则表达式的分组,把需要的值分组,再传到处理的函数中

    # 1、直接通过分组接收,按顺序传值
    def up_student(request,id,name):
        print(id,name)
    
    urlpatterns = [
        url(r'^up_student/(w+)/(w+)', up_student),
    ]
    # 2、我们可以通过有名分组,不用按顺序也能传值
    
    def up_student(request,name,id):
        print(id,name)
    
    urlpatterns = [
        url(r'^up_student/(?P<id>w+)/(?P<name>w+)', up_student)
    ]

    1.3 路由正则

    1、$符,以什么结尾

    url(r'^test/',test),
    # 这种在访问时在/后面加什么都可以访问
    url(r'^test/$',test)
    # 这种就是必须/结尾才可以
    

    2.^ 通配

    url(r'^',test)

    通配会匹配所有的url,可以用作匹配不到url时返回的页面(404)

    所以我们通配符必须放在最后,不然他会先匹配通配,导致原有的url无法访问

    1.4 反向路由

    反向路由主要是针对form表单,当我们的uri发生变化时,所有的链接也要相应的发生变化

    所有有个反向路由,可以让form表单里的action跟随uri的变化而变化

    后台url:设置name属性

    url(r'^sdsdsdsad/',test,name="xxx")
    

    前端form表单:action改为随后面的name变化而变化

    <form action="{% url "login" %}" method="post">
    

    1.5 django创建app

    我们会把不同类型的逻辑函数和uri放到不同的文件里,这个文件就成为app

    创建有两种方式

      1、pycharm创建项目时创建,只能创建一个

      2、命令行创建,进入到项目的路径下输入

        python manage.py startapp 自定义名称

    创建完的app文件中有如下就和文件

      admin.py: 写和django-admin相关的配置

      apps: 对app的配置

      models: 数据表模型

      views: 视图函数

      tests: 测试

    1.6 路由分组

    # 先要导入include方法
    from django.conf.urls import include
    # 总urls.py
        url(r'^app01/', include('app01.urls'))
    
    # 分app urls.py
        # 导入视图函数
        from app01 import views
        url('^test',views.test)

    2. 函数视图

    函数视图主要写一些逻辑函数,函数视图主要分为两种

    1、FBV  function based view  写函数处理逻辑

    2、CBV  class based view  通过类处理逻辑

    在CBV中

    url需要做些改变

    url(r'^login/', views.Login.as_view()),

    处理逻辑的类也需要继承View这个类

    from django.views import View
    class Login(View):
        def dispatch(self, request, *args, **kwargs):
            super(Login, self).dispatch(request, *args, **kwargs)
            # 自定制逻辑
    
        def get(self):
            pass
    
        def post(self):
            pass
    
    # 如果是get提交就进入get函数,post提交就进入post函数
    # 底层走的是dispatch函数,他会根据你的提交方式分发到不同函数里
    # 我们也可以重写这个方法,加入一些其他限制,例如限制ip等等

    2.1 提交方式

    """
    常见的几种提交方式
    get    :请求数据
    post   :提交数据
    delete :删除数据
    put    :更新数据
    patch  :更新部分数据
    """

    3. Django中的ORM初步

    3.1 ORM配置

    """
    1、创建数据库
    2、配置mysql的数据库链接
        setting文件里的DATABASES设置为
        DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 's8day61',    ## 数据库名称
            'USER': 'root',
            'PASSWORD': '123',    ## 安装 mysql 数据库时,输入的 root 用户的密码
            'HOST': '127.0.0.1',
        }
    3、注册app
        也是在settings文件中的INSTALLED_APPS
        把你的app文件名加进去
    4、需要把mysqldb设置为pymysql链接
        python3中用的是pymysql
        python2中使用的是mysqldb
        
        为了兼容,都改成pymysql
        app下的__init__文件
            import pymysql
            pymysql.install_as_MySQLdb()
    5、创建表(2个命令)
        
        python manage.py makemigrations
        
        python manage.py migrate
    
    """

    3.2 单表的增删改查

    # 先导入models文件
    from class_app import models
    
    #
    models.Classes.objects.create(name="xxx")
    # 增加会有一个返回值,这个返回值就是这次插入的对象
    
    #
    # 查出所有对象    ==> 列表里套对象
    models.Classes.objects.all()
    # 查出单个对象    ==> 取第一个对象
    models.Classes.objects.first()
    # 也可以
    models.Classes.objects.all().first()
    # 过滤查询
    models.Classes.objects.filter(name="xxx").all()
    
    #
    models.Classes.objects.filter(name="xxx").delete()
    
    #
    models.Classes.objects.filter(name="xxx").update(name="ooo")
    # 如果需要改的值很多,并且在一个字典里,也可以用**打散
    models.Classes.objects.filter(name="xxx").update(**dic)
    单表的增删改查

    3.3 django中orm的表的正查与反差

    # 如果一张表和其他的表建有外键关系,那么从这张表查另一张表称为正查,反之称为反差
    # 先建立两个外键关系的表
    class Classes(models.Model):    # 如果我们不设置一张表的id时,django会自动帮我创建一个自增的主键id
        name = models.CharField(max_length=32,null=True)
    
    class Students(models.Model):
        name = models.CharField(max_length=32,null=True)
        cid = models.ForeignKey("Classes",null=True)    # 会自动帮我们和另一张表的主键建立外键关系
    
    # 正查
    for obj in students:
        print(obj.cid.name)     # 可以直接通过对象点里面的属性就可以点出另一个类的对象,可以继续取值
    
    # 反查
    obj.student_set.all()       # 就是查出所有的对象
    
    # 还可以通过下划线直接取到另一张表的值
    # values是取出括号里对应的值,通过列表里套字典的形式
    # values_list 是取出括号里对应的值, 通过列表里套元组的形式
    models.Classes.objects.values("id","name","cid__name").all()
    正向和反向查询

    3.4 双下划线

    # 查询时通过外键名__另一张表的名字  可以查到关联表的值
    # eg:
    models.Classes.objects.values("id","name","cid__name").all()    #这个cid__name可以查询到关联表对应的name
    # 查询时可以在filter中加入限制条件  __lt 代表小于  __gt代表大于
    # eg:
    models.Classes.objects.filter(id__lt = 3).all()     # id < 3
    models.Classes.objects.filter(id__gte = 3).all()    # id >= 3
    第三种查询方式—神奇的双下划线
  • 相关阅读:
    用GDB调试程序(一)
    vim添加删除多行注释
    python binary lib on win/各种python库的二进制包
    python使用libssh2连接linux
    python xpath
    splinter python浏览器自动化操作,模拟浏览器的行为
    pytesser图片文本识别
    python验证码识别
    Python 之 使用 PIL 库做图像处理
    Connection reset by peer问题分析
  • 原文地址:https://www.cnblogs.com/gouyang/p/11221362.html
Copyright © 2011-2022 走看看