路由系统
伪静态案例:
https://www.cnblogs.com/linhaifeng/articles/ 7133167(id) + .html
使用伪静态的原因:
a. 美观
b. seo (搜索引擎优化技术,研究各大搜索引擎的收录规则):
设置方法:
1.html中的met标签a: name=keyword value=“xxx,培训” (value后面的会收录到搜索引擎的数据库)
2.优化url,因为搜索引擎偏好静态网站,所以设置伪静态
根据第二种设置方法,Django如何实现
路由分发:
html: http://127.0.0.1:8000/up_studnet/12/
url:
url(r'^index/(w+)/(w+)/', index), ()是分组,这种事位置传参
url(r'^test/(?P<id>w+)/(?P<name>w+)/', test), 这种 取别名传参
函数:
def test(request, name, id):
print(id , name)
return HttpResponse('test')
路由正则:
url(r'^test2/$', test2) 以什么开头以什么结尾(就找test2/)
url(r'^', notfound) 自定义404 not found( 需要写到最下面)
反向路由:
后台url:
url(r'^logindjsajdbjsabdsabdbsabdhsabdhbsahbdsaasa/$', login, name='xxx')
前台:
<form action="{% url 'xxx' %}">
<input type="text">
</form>
django创建app:
python3 manage.py startapp 自定义app名称(文件夹)
app01下面文件:
admin.py : 写和django-admin相关的配置
apps: 对app01的配置
models: 数据表模型
tests: 测试
views: 视图函数
路由分组(火箭分离):
总urls.py;
url(r'^app02/', include('app02.urls')),
url(r'^app03/', include('app03.urls')),
分appurls.py:
from app03 import views
urlpatterns = [
url(r'^students/', views.studnets)
]
函数视图
FBV(在views写的逻辑全是函数)
CBV(用类去写):
app01:
urls.py:
url(r'^login/', views.Login.as_view()),
views.py:
from django.views import View
class Login(View):
def get(self, request): GET请求走这个
return render(request, "login.html")
def post(self, request): POST请求走这个
uname = request.POST.get('username')
return HttpResponse('ok')
http请求的一些方法:
'get': 请求数据
'post': 提交数据
'delete': 删除(这个)数据
'put': 更新(这个)数据
'patch': 更新部分数据
注意:
form表单提交 只支持get、post
ajax全部支持
view这个类的底层原理:
dispatch方法通过字符串的反射来获得对应的方法
案例:
def dispatch(self, request, *args, **kwargs):
super(Login, self).dispatch(request, *args, **kwargs)
下面可以自定制预处理操作,比如 通过request,来进行权限管理
ORM(用pymysql连接数据库)
1.配置ORM(settings文件中完成):
a.创建数据库
b.配置mysql链接数据库:
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3', sqlite3(小型文件数据库)Django默认的数据库
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 's8day61', ## 数据库名称
'USER': 'root',
'PASSWORD': '123', ## 输入的 root 用户的密码
'HOST': '127.0.0.1',
}
}
c. 注册app:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app02',
'app03' 注册 创建好的全部qpp,如果不注册,models模型无法生成相对应的表
]
d. 需要将mysqldb换成pymysql
python3:
pymysql
python2:
MySQLdb(Django默认的连接方法)
每个app下的 __init__.py文件
import pymysql
pymysql.install_as_MySQLdb()
2.ORM创建表
一对多:
class Department(models.Model): #id这一列可以不写 title = models.CharField(max_length=32, null=True) class UserInfo(models.Model): id = models.AutoField(int类型)(primary_key=True) uname = models.CharField(max_length=32, null=True) age = models.CharField(max_length=32, null=True) email = models.CharField(max_length=32, default="") ud = models.ForeignKey("Department", null=True) #与Department创建外键关系, 生成的外键名是ud_id
创建表 命令:
python3 manage.py makemigrations
执行完成后,在当前app的migrations文件夹下创建一个0001_initial文件,里面有要创建表名和列
python3 manage.py migrate
根据上面的文件生成表(默认表名是 app_表名)
表的改:
如果已经建好表,还要再models添加列,重复上面操作(也就是在生成一个0001_initial文件,里面只有需要加列的代码)
如果改列明直接在models改,然后重复上面操作,中间选y
遇到的问题:
email = models.CharField(max_length=32)
如果后面不加
选1,后面跟email的默认值
选2,退出,自己在models代码填写
a) null=True
b) default=""
3.ORM对数据库的操作:
def test(request): from app03 import models =====================单表 的增删改查====================== #增加: # models.Department.objects.create(title="保安部") 增加一行数据,列名="xxx" # 查询: #1.查询所有( 返回列表套对象( 一行一行数据当做一个个对象返回)) # res = models.Department.objects.all() # <QuerySet [<Department: Department object>, <Department: Department object>]> # for row in res: # print(row.id, row.title) #2.指定查哪些列( 返回列表套字典) #select title from department ; # res = models.Department.objects.values("title").all() # ### <QuerySet [{'title': '保安部'}, {'title': '开发部'}, {'title': '开发部'}]> # for row in res: # print(row['title']) #2指定查哪些列(返回列表套元祖) # res = models.Department.objects.values_list("title").all() # ### <QuerySet [('保安部',), ('开发部',), ('开发部',)]> #限制条件查(返回列表套对象) #select * from xxx where title = "开发部" # res = models.Department.objects.filter(title='开发部').all() # res = models.Department.objects.filter(id__lt = 3) id<3 # res = models.Department.objects.filter(id__lt = 3) id<=3 # res = models.Department.objects.filter(id__gt = 3) id>3 #取查询所有的第一条数据(直接返对象,没有列表回一个) # res = models.Department.objects.all().first() #删: # models.Department.objects.filter(id=3).delete() #更新 # models.Department.objects.filter(id=2).update(title='xxxx') =====================一对多 的增删改查====================== #增(第一种): # models.UserInfo.objects.create(uname = "zekai3", age=15, email="dddd@qq.com", ud_id=2) # models.UserInfo.objects.create(uname = "zekai4", age=16, email="gggg@qq.com", ud_id=2) # models.UserInfo.objects.create(uname = "zekai5", age=18, email="hhhh@qq.com", ud_id=1) #增(第二种): # info = {"uname":'zekai2', 'age':13, "email":'123@qq.com', "ud_id":2} # models.UserInfo.objects.create(**info) #查询: #正向查询(返回列表套对象) # res = models.UserInfo.objects.all() # for row in res: # print(row.id, row.uname, row.age, row.ud.title) 1.ud这个外键,代表着关联对方的每一条数据 返回的是UserInfo表中每一行的ud_id对应的Department中的xxx 2.ud后面跟外键表名,后面还可以跟外键的外键表名,也就是链式查询 #反向查询(返回的是列表套对象) # res = models.Department.objects.all() # for row in res: # print(row.title, row.userinfo_set.all()) 后面还可以跟.first()等等、、、 1.写法: 小写的表名_set.all() 2.将Department表中每一条数据对应的UserInfo的数据返回 #删: # models.Department.objects.filter(id=3).delete() #更新 # models.Department.objects.filter(id=2).update(title='xxxx') =============================双下划线============================== #神奇的双下画线 当使用values查询时,返回的不是对象, 而ud__title返回的是ud外键表中title列中所有数据(正向查询) res = models.UserInfo.objects.values('id', 'uname', "ud__title").all() print(res) 反向查询同上 res = models.UserInfo.objects.values_list('id', 'uname', "ud__title").all() print(res) return HttpResponse('ok')