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
    第三种查询方式—神奇的双下划线
  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/gouyang/p/11221362.html
Copyright © 2011-2022 走看看