zoukankan      html  css  js  c++  java
  • python web django base skill

    web框架本质

    socket + 业务逻辑
    
    框架实现socket      tonado  node.js
    使用WSGI实现socket  django flask
    

    自己实现框架思路

    wsgiref socket
    路由系统
    自己写逻辑(views)
    jinja2  模板引擎(templates) 实现动态页面,修改返回给浏览器的字符串
    去db取数据(models)
    

    web框架流程

    流程:  wsgi --> 路由系统 -- views(核心逻辑) --- template(拿html) --- )db  (model)
    
    1 用户请求到wsgi
        wsgi整理用户请求env,加上一个返回数据的conn,传给后面路由系统
    2 请求到路由系统
    3 请求到view, 核心逻辑
    3 tpl 拿模板     模板引擎 jinja2
    4 数据库拿数据  ORM(Model)
    5 合在一起
    6 使用 步骤 1 传过来的conn,回传数据
    

    install django and create a django project

    pip install django=1.9.5
    django-admin startproject my_site  创建工程
    cd mysite
    python manage.py startapp monitor       创建APP
    python manage.py startapp cmdb          创建APP1
    python manage.py runserver 0.0.0.0:9999
    
    这几条命令然并卵,可以在pycharm上面图形化操作
    

    来吧,开始django吧

    全局配置

    一般一看就明白,添加一个新的
    STATICFILES_DIRS = ( os.path.join(BASE_DIV, "statics"), ) js css img放在这里
    

    后台管理manage.py 命令

    python manage.py makemigrations
    python manage.py migrate
    python manage.py createsuperuser   # 创建超级用户管理后台
    python manage.py shell
    
    在settings 里面配置数据库引擎
    

    路由系统 urls

    普通         (r"^/index/", vews.index),
    动态传参数    (r"^/index/(d+)", vews.index),
    路由分发      (r"^/index/", include("appname.urls")),
    

    template 模板

    取值
    list dict object 通过.来取值
    li = [1,2,3]
    dic = {"k1":"v1", "k2":"v2"}
    {{ k1 }}
    {{ li.0 }}
    {{ dic.k1 }}
    
    逻辑控制
    {% for item in data %}
        {{ item }}
        {{ forloop.counter }}  特殊变量 索引
        {{ forloop.first }}  特殊变量  是否是第一个
        {{ forloop.last }}  特殊变量   是否是最后一个
    {% endfor %}
    
    {% if 1 == 1%}
    {% else %}
    {% endif %}
    
    
    母版
        定义
        {% block blockname %}
        {% endblock %}
    
        使用:
        {% extend "front/xx.html" %}
        
        经验:一般会定义4个block
        title  css content js  子html在继承的时候一般都是修改这几块
    
    
    导入
        直接导入一个小的元素
        {% include "front_app/ss.html" %}
    
    
    内置函数
    
    
    
    自定义函数  -- 然并卵,直接在python中做,不就行了
        分类:
        filter 只能穿一个参数      支持if的条件,通过管道
        simple_tag 可以穿多个参数  不支持if的 条件
    
    
        settings中注册APP
        在APP里面创建templatetags
        创建任意py文件,在里面写函数
            from django import template
            from django.utils.safestring import mark_safe
            from django.template.base import resolve_variable, Node, TemplateSyntaxError
    
            register = template.Library()  # 这个名字不能改
            
            @register.filter
            def plus_10(arg):
                return arg + 10
            
            @register.simple_tag
            def my_simple_time(v1,v2,v3):
                return  v1 + v2 + v3
      
            @register.simple_tag
            def my_input(id,arg):
                result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
                return mark_safe(result)
                
        使用:
        {% load xx %}  先导入
        {% k1|f1 %}
        {% my_simple_time 1 2 3%}  在使用,后面是参数
        {% my_input 'id_username' 'hide'%}
    

    简单数据库管理

    基本说明

    class注册admin
    admin.site.register(CLASS)
    
    def __str__():   为了让现实好看,在model下面覆盖此方法
    有个admin的页面可以使用,简单的数据库管理后台
    

    定制admin界面

    写一个定制类,继承 admin.ModelAdmin
    class BookAdmin(admin.ModelAdmin):
        list_display = ('name', 'publisher', 'publish_date')
        list_filter = ('publisher', 'publish_date')
        list_editable = ('name', 'publish_date')
        list_per_page = 10 # 每页显示多少
        list_selected_related = ()
        serach_fields = ('name', 'publish__name')  # __ is magic
        
        
        # 定制详细页面
        filter_horizontal = ('authors', )  # 针对多对多 Manytomany
        raw_id_filds = ('publisher', )  # 针对ForeignKey
        
    国内有一个xadmin ,深度定制admin,效果很棒
    
    
    定制admin action
    actions = [f1, ]  # 在BookAdmin装饰类中新增,  f1(bookAdmin, request, querySet) 是一个函数,处理逻辑的
    
    
    定制显示颜色
    在model中写一个函数,返回style
    在BookAdmin 装饰类中 list_display = (f1)
    

    数据库model

    写class
        class User(model)
        modes.CharField(maxlength=32)
        modes.IntegerField()
    
    配置settings    INSTALL_APPS
    
    创建数据库
    python manage.py makemigrations
    python manage.py migrate
    
    curd操作
    
    models.UserInfo.objects.create(username=“yangli”, password="123456")
    models.UserInfo.objects.create(**dict)
    obj = models.UserInfo(username="yangli2", password="12345")
    obj.save()
    
    models.UserInfo.objects.filter(   ).delete()
    models.UserInfo.objects.filter(  ).update(password="123")  # 这种修改方式效率高
    
    models.UserInfo.objects.get(id=1)
    models.UserInfo.objects.filter(  ).all()
    models.UserInfo.objects.filter(  ).all().values(id,email)     # 字典
    models.UserInfo.objects.filter(  ).all().value_list(id,imail)  # list and tuple
    models.UserInfo.objects.filter(  ).first()   last()
    models.UserInfo.objects.filter(name="yangli")
    models.UserInfo.objects.filter(name__exact="yangli")
    models.UserInfo.objects.filter(name__iexact="yangli")
    models.UserInfo.objects.filter(name__contains="yangli")
    models.UserInfo.objects.filter(name__icontains="yangli")
    models.UserInfo.objects.filter(name__startswith="yangli")
    models.UserInfo.objects.filter(name__endswith="yangli")
    models.UserInfo.objects.filter(name__range=[1, 3]).order_by("-name")  # 排序
    models.UserInfo.objects.all()[0:2]
    
    
    连表查询
    # __ is magic, 可以作用于外键的属性
    models.Entry.objects.filter(blog__name__contains="科技模块")
    models.Entry.objects.filter(blog__name__icontains="tech")
    
    字段对比查询
    from django.db.models import F
    models.Entry.objects.filter(n_comments__gt=F('n_pingbacks') * 2 )
    models.Entry.objects.filter(mode_date__gt = F('pub_date') + timedelta(days=3))  # 在发布3天后修改的所有实体
    
    
    
    添加有关联的表格:
    book -- publisher   one-to-one
    book -- authors     many-to-many
    new_book = Book(
        title = "learn python to Alex",
        publish_id = publish_id   # class 中没有publish_id,但是可以这么用,不用传一个对象
        # authors 是一个多对多的关系,先保存再添加
    )
    new_book.save()
    new_book.authors.add(1,2,3)
    new_book.authors.add(*authors_ids)
    
    
    
    返回动态数据给页面
    render(request, "t1.tpl", {"li":users_list})
        注意配置模板的路径
        
    
    当使用post提交数据的时候,暂时先注释settings里面的csrf
    
    
    
    常用的数据库字段和属性类型:
    https://docs.djangoproject.com/en/1.10/ref/models/fields/#primary-key
    
    IntegerField()   FloatField()
    CharField()  TextField()
    DateField()
    EmailField()
    TimeField()
    ImageField()  FieldPathFiled()  # 数据库里面存的是路径,django admin 提供直接上传的功能
    
    
    
    Filed option
    null=True  # 限制db
    bank=True  # 限制django admin form
    uniq=True
    default="default"
    primary_key=Truet
    
    auto_now      当前时间,创建的时候更新
    auto_now_add  当前时间,每次修改更新
    
    gender_choices = ((0, "female"),(1,"male"),)
    choices=gender_choices
    
    volidators = []
    upload_to="upload"  # FileFiled() ImageField()  指定文件放在什么地方
    

    数据库高级增删改查

    content:
    
        在test.py通过 django API  操作数据库
        设置环境变量
        import os
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "projectname.settings")
        import django
        djang.setup()
    

    路由系统

        直接路由
        包含跳转路由
        
        括号传参数
        定义别名  ?P<name>
        字典传额外参数
    

    模板 template

    渲染模板 jianja2

        把字典通过render()传给渲染模块, 字典的value是object,在模板里面通过 . 来取对象的属性
        
        li = []  dic = {}  user = User(name="yangli", password="123")
        li.1 dic.k1  user.name  user.password
        
        常见语法:
        {% for item in objs %}
        {{  item }}
        {% endfor %}
        
        {% if forloop.count0|divisibleby:"2" %}
        {% else %}
        {% endif %}
        
        模板小结:
        没有while循环,因为while循环可能是死循环,这个后端不能够有这个
        模板中不能够设置变量
        当模板中使用了一个变量,render并没有传过来的时候,并不会报错,仅仅留空
    

    模板继承

        父亲:
        自定允许修改的块
        {% block name %}
        
        {% endblock %}
        
        儿子:
        {% extend "path" %}  # 儿子继承一个父类
        {% block name %}  # 在这里重写父亲的块
        
        {% endblock %}
        
        # include 这个插件
        {% include "app01/registor.html" %}
        
        继承小结:
        模板继承可以嵌套,父亲和爷爷辈的都可以重写
        模板继承不能多继承
    

    前端 frontend html css js jQuery ajax6

  • 相关阅读:
    如何发现需求
    测试linux和window下 jdk最大能使用多大内存
    java获取汉字的拼音 简单版
    oracle一条sql执行导入sql文件
    oracle使用闪回功能恢复删除的表数据
    linux环境变量配置
    有两张表;使用SQL查询,查询所有的客户订单日期最新的前五条订单记录。 糖不苦
    jQuery作业 点击出弹框 糖不苦
    #{}和${}的区别是什么? 糖不苦
    在html页面中如何使用jQuery? 糖不苦
  • 原文地址:https://www.cnblogs.com/fepapa/p/5989108.html
Copyright © 2011-2022 走看看