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

python web django base skill的更多相关文章

  1. python web -- django

    一. 安装 django $ pip install django (env)$ python >> import django >> django.VERSION >& ...

  2. python web——Django架构

    环境:windows/linux/OS 需要的软件:Firefox 浏览器(别的也可以 不过firfox和python的webdriver兼容性好) git版本控制系统(使用前要配置 用户 编辑器可以 ...

  3. python web django 2nd level -- 待更新

    练习代码位置 实例代码位置 --> app: myblog Form 利用Form表单验证,自己写的html 思路: 新建一个类 LoginForm(forms.Form) 新建对象 obj = ...

  4. Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器

    Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器 闲着无聊的时候部署了一个Django项目玩,用vm虚拟机部署的. 准备工作 我使用的系统是Ubuntu16 ...

  5. [Python] 利用Django进行Web开发系列(一)

    1 写在前面 在没有接触互联网这个行业的时候,我就一直很好奇网站是怎么构建的.现在虽然从事互联网相关的工作,但是也一直没有接触过Web开发之类的东西,但是兴趣终归还是要有的,而且是需要自己动手去实践的 ...

  6. [Python] 利用Django进行Web开发系列(二)

    1 编写第一个静态页面——Hello world页面 在上一篇博客<[Python] 利用Django进行Web开发系列(一)>中,我们创建了自己的目录mysite. Step1:创建视图 ...

  7. python web框架——扩展Django&tornado

    一 Django自定义分页 目的:自定义分页功能,并把它写成模块(注意其中涉及到的python基础知识) models.py文件 # Create your models here. class Us ...

  8. 全面解读Python Web开发框架Django

    全面解读Python Web开发框架Django Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,主要目标是使得开发复杂的.数据库驱动的网站变得简单.Django ...

  9. Nginx+Python+uwsgi+Django的web开发环境安装及配置

    Nginx+Python+uwsgi+Django的web开发环境安装及配置 nginx安装 nginx的安装这里就略过了... python安装 通常系统已经自带了,这里也略过 uwsgi安装 官网 ...

随机推荐

  1. HTML表单提交标签

    <form>表单提交标签,设置提交范围 有name属性才能被提交 action:提交的地址url method:提交方式 get方式(默认):会将参数拼接在连接后,有大小限制(4k) po ...

  2. python面试的100题(14)

    32.请写出一个函数满足以下条件 该函数的输入是一个仅包含数字的list,输出一个新的list,其中每一个元素要满足以下条件: 1.该元素是偶数 2.该元素在原list中是在偶数的位置(index是偶 ...

  3. Apache 安装概要

    1.apache下载参照百度 bin文件夹下命令行:  httpd -k install 2.安装完成后排错记录 服务无法启动,到bin目录下运行  httpd.exe  查看输出,然后百度一下输出即 ...

  4. [NOIP2018(PJ)] 摆渡车

    题目链接 题意 有 $n$ 个同学在等车,每位同学从某时刻开始等车,相邻两趟车之间至少间隔 $m$ 分钟.凯凯可以任意安排发车时间,求所有同学等车时间之和的最小值. 分析 这题首先能想到是动态规划 很 ...

  5. Python基础与科学计算常用方法

    Python基础与科学计算常用方法 本文使用的是Jupyter Notebook,Python3.你可以将代码直接复制到Jupyter Notebook中运行,以便更好的学习. 导入所需要的头文件 i ...

  6. Java-POJ1010-STAMP

    说良心话,题目不难,但是题目真的很不好懂,解读一下吧 题意: 读入分两行,第一行为邮票面额(面额相同也视为种类不同)以0结束,第二行为顾客要求的面额,以0结束 要求:每个顾客最多拿4张邮票,并求最优解 ...

  7. 编写自定义的django-admin命令

    先写标题内容后续补充上 官方文档如下 :http://python.usyiyi.cn/documents/django_182/howto/custom-management-commands.ht ...

  8. Java数据处理,Map中数据转double并取小数点后两位

    BigDecimal order = (BigDecimal) map.get("finishrat"); double d = (order == null ? 0 : orde ...

  9. 阻塞队列BlockingQueue之ASynchronousQueue

    一.SynchronousQueue简介 Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除 ...

  10. 【正确使用vim编辑器的姿势】

    "vi:可视化接口(Visual Interface) vim:是vi的增强版(vi iMprove) vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中 ...