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 用戶請求到wsgiwsgi整理用戶請求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個blocktitle css content js 子html在繼承的時候一般都是修改這幾塊導入直接導入一個小的元素{% include "front_app/ss.html" %}內置函數自定義函數 -- 然并卵,直接在python中做,不就行了分類:filter 只能穿一個參數 支持if的條件,通過管道simple_tag 可以穿多個參數 不支持if的 條件settings中注冊APP在APP里面創建templatetags創建任意py文件,在里面寫函數from django import templatefrom django.utils.safestring import mark_safefrom django.template.base import resolve_variable, Node, TemplateSyntaxErrorregister = template.Library() # 這個名字不能改@register.filterdef plus_10(arg):return arg + 10@register.simple_tagdef my_simple_time(v1,v2,v3):return v1 + v2 + v3@register.simple_tagdef 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', ) # 針對多對多 Manytomanyraw_id_filds = ('publisher', ) # 針對ForeignKey國內有一個xadmin ,深度定制admin,效果很棒定制admin action
actions = [f1, ] # 在BookAdmin裝飾類中新增, f1(bookAdmin, request, querySet) 是一個函數,處理邏輯的定制顯示顏色
在model中寫一個函數,返回style
在BookAdmin 裝飾類中 list_display = (f1)
數據庫model
寫classclass User(model)modes.CharField(maxlength=32)modes.IntegerField()配置settings INSTALL_APPS創建數據庫
python manage.py makemigrations
python manage.py migratecurd操作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-keyIntegerField() 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=Truetauto_now 當前時間,創建的時候更新
auto_now_add 當前時間,每次修改更新gender_choices = ((0, "female"),(1,"male"),)
choices=gender_choicesvolidators = []
upload_to="upload" # FileFiled() ImageField() 指定文件放在什么地方
數據庫高級增刪改查
content:在test.py通過 django API 操作數據庫設置環境變量import osos.environ.setdefault("DJANGO_SETTINGS_MODULE", "projectname.settings")import djangodjang.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