目录
python主流web框架
1.django框架 同步框架
大而全、自身自带的组件非常的多
类似于航空母舰
但是在写一些小的项目或者是流动性较强的项目的时候
使用django框架可能会让你感觉到笨重
2.flask框架 同步框架
小而精、自身自带的组件非常的少
类似于游骑兵
虽然flask本身没有什么功能但是支持flask框架的第三方模块特别的多,如果将flask第三方模块加起来完全是可以超过django的
有时候框架的更新迭代功能上反而会受限于第三方模块
3.tornado框架 异步框架
异步非阻塞
异步
提交完任务之后不原地等待任务的结果直接指向下一行
非阻塞
程序要么处于运行态、要么处于就绪态(最大化的占有CPU)
速度非常的快、快到甚至可以开发游戏服务器
# 上述三个web框架不要同时学习,一定要先学完一个之后再学其他的,不然的话极有可能出现混淆
web框架作用范围
浏览器发送请求>>>nginx反向代理>>>uwsgi(web服务网关接口)>>>后端服务器(web框架)
web框架里面包含了所有处理业务逻辑的代码
使用框架的好处在于很多py文件和文件夹都不需要你自己创建
你只需要往框架提供好的文件里面填写代码即可(搬砖)
django框架
1.版本
1.X公司里面大部分也用的是1.X版本
2.X也有使用的情况,但是2.X和1.X差距不大
3.X新出来的版本 具有异步的功能(该功能还在研发当中 不用)
2.下载
pip3 install django==1.11.11
3.如何验证是否下载完毕
打开终端输入django-admin如果出现了一堆代码说明成功了
django项目
1.命令行操作django
1.创建django项目
django-admin startproject 项目名
2.启动django项目
切换到项目目录下
python3 manage.py runserver
(django默认端口号8000)
3.创建app
python3 manage.py startapp app的名字
(老男孩传统app01、02、03、04...)
# 注意创建的app一定要去django配置文件中注册,否则可能无效
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 你创建的app一定要在这里面注册一下
'app01' # 简写
# 'app01.apps.App01Config' # 全称
]
2.pycharm操作django
django中的app的概念
django框架本身只是一个空壳子 该空壳子只是给你提供了一个能够正常运行的环境,如果你想要写业务逻辑代码就需要创建app(应用)
一个django项目可以有多个应用
django项目看成是大学
应用看成是大学里面的一个个学院
比如你想用django开发淘宝
淘宝有很多功能区域
订单模块
订单app
客户模块
客户app
购物模块
购物app
售后模块
售后app
# 不同的功能模块就创建不同的app这样的话能够实现代码的解耦合、更加有利于分组开发
注意事项
1.你的计算机名称不能有中文
2.python解释器如果是3.7可能会报错
点击报错的地点将逗号删掉即可
或者用python3.6
3.项目名文件名也尽量不要用中文
4.一个pycharm窗口就是一个django项目,不要做文件夹的嵌套
django主要文件介绍
项目名
项目同名文件夹
settings.py 配置文件
urls.py 路由
templates文件夹
里面放的是一对html文件
应用文件夹
migrations文件夹 数据库迁移记录
admin.py django后台管理
models.py 模型层(跟数据库打交道)
views.py 视图层(业务逻辑代码)
manage.py django的启动(入口)文件
# 运行一次django之后 会出现一个db.sqlite3文件
'''
django默认自带一个小型的sqlite3数据库
'''
django请求生命周期流程图
urls.py
views.py
templates
models.py
django小白必会三板斧
请求流程
浏览器输入地址
urls.py匹配对应的地址
去views.py执行对应的函数
函数的返回值就是给浏览器的结果
1.HttpResponse
返回字符串
2.render
返回html页面
3.redirect
重定向
# views.py
from django.shortcuts import render,HttpResponse,redirect
def f1(request):
return HttpResponse('你好啊')
def f2(request):
return render(request,'f1.html')
def f3(request):
return redirect('/index/')
# urls.py
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.f1),
url(r'^func/', views.f2),
url(r'^home/', views.f3),
]
登录功能
1.应该在后台开设一个访问登录页面的url
静态文件
网站需要使用的已经写好了的文件
比如页面的
css文件
js文件
image文件
第三方插件文件
在django中静态文件需要你自己创建一个专门存放静态文件的文件夹
浏览器输入url之所以能够拿到对应的页面和数据
是因为后端提前开设该资源的接口
(拿不到资源说明没有开设对应的接口)
静态文件配置
STATIC_URL = '/static/'
# 静态文件配置 开设资源
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'), # 将static文件里面的资源全部暴露给外界
os.path.join(BASE_DIR,'static1'), # 将static文件里面的资源全部暴露给外界
os.path.join(BASE_DIR,'static2'), # 将static文件里面的资源全部暴露给外界
]
"""
STATIC_URL = '/static/'是令牌 要想访问静态文件资源 必须以/static/开头
STATICFILES_DIRS后面的列表才是真正的文件夹的路径
查找的时候会按照从上往下的顺序查找文件
"""
静态文件动态查找:动态解析接口前缀(令牌)
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
请求方式
get请求
朝别人要数据 也可以携带一些参数
eg:获取招聘信息但是可以加限制(本科、D轮及以上)
post请求
朝别人提交数据
eg:登录、注册
form表单
action
控制提交的路径的
1.不写的话
默认就是朝当前页面所在的url提交数据
2.全称
https://www.baidu.com
3.后缀
/index/
朝当前服务器路径index发请求
method
1.method默认是get请求
get请求携带参数的特点
url?username=jason&password=123
2.method还可以修改为post
post请求携带参数
放在了请求体里面
HTTP协议
四大特性
1.基于请求响应
2.基于TCP/IP作用于应用层之上的协议
3.无状态
4.无/短连接
请求格式
请求首行
请求头
请求体(pots请求数据放在请求体里面 get请求没有请求体)
响应格式
响应首行
响应头
响应体(浏览器能够拿到的数据)
响应状态码
1XX
2XX
3XX
4XX
5XX
csrf校验
前期提交post请求需要先去配置文件中注释掉一个中间件即可
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
request对象方法
request.method 获取请求方法
request.POST 获取post请求数据
get
getlist
request.GET 获取get请求数据
get
getlist
pycharm连接数据库
Django连接数据库
django默认使用的是自带的sqlte3数据库(比较小 功能也不全)
django连接MySQL
1.先去配置文件中修改配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'lnx_day03_2',
'USER':'root',
'PASSWORD':123,
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'utf8'
}
}
# 第一步配置完成后无法正常启动django
2.在项目文件夹下或者应用文件夹下的__init__.py文件中
import pymysql
pymysql.install_as_MySQLdb()
django orm
ORM:对象关系映射
表 类
记录 对象
记录某个字段的数据 对象的属性
# django orm只能帮你创建表,库是需要你自己提前指定好的
"""
ORM的好处在于将所有MySQL的操作封装成了面向对象的操作
让一个不会sql语句的小白也能够通过python面向对象的知识点简单快捷的操作数据库
"""
# 需要你去应用下面的models.py中书写代码
from django.db import models
# Create your models here.
class Userinfo(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True)
# name varchar(32)
name = models.CharField(max_length=32) # CharField必须要有max_length参数
# password int
password = models.IntegerField()
***********************************************************
数据库迁移命令
1.将数据库的操作记录到小本本上
migrations文件夹下面
python3 manage.py makemigrations
# 该命令不会直接操作数据库
2.将操作真正同步到数据库中
python3 manage.py migrate
***********************************************************
# 只要你在models.py中动了跟数据库相关的代码,你就必须重新执行上面的两条命令
orm简单操作
# 获取user表里面所有的数据
data = models.User.objects.all()
# print(data)
# 具有条件的查询
user_obj = models.User.objects.filter(name=username).first()
# 编辑数据
models.User.objects.filter(name='egon').update(name='egonDSB')
# 删除数据
models.User.objects.filter(id=3).delete()
# 针对字段的只需要添加或者注释然后输入数据库迁移命令即可
desc = models.CharField(max_length=32,null=True) # 该字段可以为空
country = models.CharField(max_length=32,default='China')
路由层(urls.py)
1.X版本
url()方法第一个参数其实是一个正则表达式
2.X版本
path()方法第一个参数不再支持正则,而是写什么就匹配什么
urlpatterns = [
url(r'^test/$',views.test),
url(r'^testadd/$',views.testadd),
]
有名分组与无名分组
# 无名分组
url(r'^index/(d+)/$',views.index)
'''
加了括号的正则表达式会将它匹配到的内容当做
位置参数传递给后面的视图函数
index(request,123)
'''
# 有名分组
url(r'^index/(?P<year>d+)/$', views.index)
'''
加了括号的正则表达式会将它匹配到的内容当做
关键字参数传递给后面的视图函数
index(request,year=123)
'''
'''
无名分组和有名分组两者不能混合使用
但是单独的某一个都可以使用多次
url(r'^index/(d+)/(?P<year>d+)',views.index) 不可以
url(r'^index/(d+)/(d+)/(d+)/$',views.index) 可以
url(r'^index/(?P<year>d+)/(?P<year>d+)/(?P<year>d+)/$', views.index) 可以
'''
反向解析
# 反向解析
url(r'^home666/',views.home,name='hm')
from django.shortcuts import render,HttpResponse,redirect,reverse
def index(request,*args,**kwargs):
# return HttpResponse("index")
# return redirect('/home/')
url = reverse('hm') # 最正规的
print(url)
return redirect('hm') # 也支持直接解析并跳转
针对无名有名的反向解析
在解析的时候针对正则表达式符号需要你自己传对应的参数
url(r'^index/(d+)/$', views.index,name='index'),
url = reverse('index',args=(222,)) # 最正规的
print(url)
视图层(views.py)
form表单上传文件
1.method必须是post
2.enctype必须是"multipart/form-data"
默认是urlencoded
后端获取用户上传的文件用
request.FILES
def myfile(request):
if request.method == 'POST':
# 获取用户提交的数据 包含文件
# print(request.POST) # 只能拿到非文件的普通字符串数据
# print(request.FILES)
file_obj = request.FILES.get('myfile') # 文件对象
with open(file_obj.name,'wb') as f:
for line in file_obj:
f.write(line)
return render(request,'myfile.html')
json格式数据
import json
from django.http import JsonResponse
def myjson(request):
d = {'username':'jason','password':123}
# res = json.dumps(d)
# return HttpResponse(res)
return JsonResponse(d)
CBV与FBV
FBV
基于函数的视图
CBV
基于类的视图
from django.views import View
class MyClass(View):
def get(self,request):
return HttpResponse("get方法")
def post(self,request):
return HttpResponse('post方法')
# CBV
url(r'^myclass/',views.MyClass.as_view())
'''
能够根据请求方法的不同自动匹配到类里面的方法并自动执行
'''
模板层(templates)
模板语法
支持后端将python基本数据类型传递给html页面
同时还支持传函数名、类名、对象
但是针对函数和类会自动加括号调用,但是不支持传额外的参数
# 第一种给模板传值的方式 指名道姓的传
# return render(request,'mytem.html',{'i':i})
# 第二种简单粗暴 直接一锅传
return render(request, 'mytem.html',locals())
# html页面上 通过两个大括号引用即可
<p>{{ obj }}</p>
标签及过滤器
# 过滤器(内置函数)
<p>{{ i|add:10 }}</p>
<p>{{ s|length }}</p>
<p>{{ s|slice:'0:8' }}</p>
<p>{{ ctime|date:'Y-m-d' }}</p>
<p>{{ file_size|filesizeformat }}</p>
<p>{{ res|safe }}</p>
<p>{{ res1|safe }}</p>
# 标签
if判断和for循环
{% if s %}
<p>s不是空的</p>
{% else %}
<p>s是空的</p>
{% endif %}
{% for foo in s %}
{% if forloop.first %}
<p>这是我的第一次for循环</p>
{% elif forloop.last %}
<p>这是最后一次了啊 有点累</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% endfor %}
"""
变量相关用:{{}}
逻辑相关用:{%%}
"""
模板的继承与导入
首先需要在母版中先用block划定将来可能需要被修改的区域
{% block content %}
{% endblock %}
子版需要先继承母版
{% extends 'home.html' %}
之后再利用block对之前划定的区域做内容的修改
{% block content %}
<h1 class="text-center">注册</h1>
{% endblock %}
'''
扩展
一个母版上至少应该有三个区域
css
content
js
'''
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
# 将一个html文件当做模块的形式导入
导入的基本都不是完整的html页面 而是页面的某个部分
模型层(models.py)
- orm概念
- 数据库迁移命令
表查询
# 直接书写一个测试脚本 专门测试django某个py文件
在新建的py文件或者应用自带的tests文件内书写即可
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myddd.settings")
import django
django.setup()
表关系创建
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2)
create_time = models.DateTimeField(auto_now_add=True)
# 一对多外键
publish = models.ForeignKey(to='Publish') # 自动加_id后缀
# 多对多外键
authors = models.ManyToManyField(to='Author') # 虚拟字段 不会在表中出现
# 只是用来告诉orm需要创建书和作者的第三张关系表
class Publish(models.Model):
name = models.CharField(max_length=32)
email = models.EmailField()
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
Author_detail = models.OneToOneField(to='AuthorDetail')
class AuthorDetail(models.Model):
phone = models.BigIntegerField()
addr = models.CharField(max_length=32)
'''
判断表关系用换位思考
书和出版社是一对多的表关系
书是多的一方
外键字段建在多的一方
书和作者是多对多的表关系
多对多外键字段建在任何一张表都可以
但是推荐建在查询频率较高的表中
作者和作者详情是一对一表关系
一对一外键字段建在任何一张表都可以
但是推荐你建在查询频率较高的表中
'''
# 一对多和一对一字段都会自动帮你加_id后缀
# 多对多字段会自动帮你创建第三张表
跨表查询
按照我们上面创建好的表参考博客即可
https://www.cnblogs.com/Dominic-Ji/p/10881214.html
拷贝了视频的可以直接查看相应的多表操作的内容
day55视频