一、网页基础知识
网络连接过程
- 关系:
- socket客户端
- 浏览器完成
- socket服务器端
- 编写网页程序实现
- socket客户端
- HTTP
- 无状态、短连接:通讯结束后即断开连接
服务器端的基本逻辑过程
import socket
sock=socket.socket()
sock.bind('127.0.0.1',8080)
sock.listen()
while True:
conn,addr=sock.accept()
data=conn.recv(8096)
conn.send(b'123123') #服务器端返回的数据,一般返回的是HTML页面
conn.close()
自己写网站:
a. socket服务端
b. 根据URL不同返回不同的内容
- 路由系统:URL->函数
c. 字符串返回给用户
- 模板引擎渲染:
- HTML充当模板(特殊字符)
- 自己创造任意数据
- 返回的内容本质是字节编码的字符串,一般encoding='utf-8'
web框架种类:
- a,b,c
- [第三方a],b,c -->(wsgiref)Django
- [第三方a],b,[第三方c]
http请求知识
-
post和get的区别
HTTP请求包格式
HTTP响应包格式
post和get的区别:- 共同点:都是HTTP中请求数据的方法
- get请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连;
- post把提交的数据则放置在HTTP包的包体中;
- 所以,post方法比get方法相对安全些,但是post方法传输的数据在包体中以明文存在,存在一定的安全隐患,所以又有了HTTPS协议。
get 和 post是HTTP中请求数据的方法;application json 与form表单是HTTP中传输文件的类型,
-
浏览器向服务器异步请求数据
- 异步:异步,异嘛,不同的意思,这里也就是指不跟浏览器加载执行网页代码的步伐一致,也就是说在一个网页中需要用户操作来触发执行代码,而不是整个网页代码一次性执行完毕。(这里的用户操作是指在同一个网页下面请求代码执行渲染,而不是让浏览器直接跳转渲染另一个页面)
- XMLHttpRequest(也就是networks下的XHR):基于XML的HTTP请求。是一个浏览器接口,使得Javascript可以进行HTTP(S)通信。自从浏览器提供有了XMLHTTPRequest这个接口之后,ajax操作就此诞生。
- AJAX(Asynchronous JavaScript and XML,异步的JavaScript和XML):ajax就是基于浏览器提供的XMLHttpRequest对象来实现的。
- XML(eXtensible Markup Language,可扩展标记语言):在浏览器中使用XMLHTTPRequest对象在服务器之间通信,传输的数据是使用XML的方式,但最终还是会被转换成json数据格式来被我们使用。
二、创建项目及项目配置
创建项目
-
pip install django django-admin startproject mysite cd mysite python manage.py runserver
-
处理用户请求实现代码
from django.shortcuts import HttpResponse,render,redirect def login(request): """ 处理用户请求,并返回内容 :param request:用户请求相关的所用信息(对象) :return: """ # 字符串 return HttpResponse('<input type="text" />') return HttpResponse('login.html') if request.method == 'GET': # 返回网页 return render(request,'login.html',{msg:'123123'}) #前端页面的{{msg}}处显示页面传递过去的值 else: #用户POST提交数据(请求体),标签属性method=POST u=request.POST.get('user') # 若key正确则返回值,否则返回none p=request.POST.get('pwd') if u=='root' and p=='123123': # 登录成功 return redirect('https:www.baidu.com') else: return render(request,'login.html')
文件目录结构
-
文件目录结构
-
前端页面默认路径:
项目基本配置
-
时区
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
-
数据库连接——MySQL
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'bishe', 'USER': "root", 'PASSWORD': "123456", 'HOST': "localhost", } }
三、数据库
数据库迁移
-
python manage.py migrate python manage.py makemigrations python manage.py # 只对某个APP数据迁移 python manage.py makemigrations <appname> python manage.py migrate <appname>
完成某个工程下特定的apps的数据迁移,一定要注意Django不会自动注册新创建的APP,所以一定要自己在项目的配置文件
setting.py
的INSTALLED_APPS
中完成APP的注册-
migrate
,负责对INSTALLED_APPS中的应用程序迁移。 -
makemigrations
, 负责基于你的模型修改创建一个新的迁移 -
sqlmigrate
, 展示迁移的sql语句 -
showmigrations
,其中列出了项目的迁移及其状态。
-
数据库迁移会遇到的问题
数据库类别
sqlite
数据库操作
- TypeError: init() missing 1 required positional argument: 'on_delete' 解决办法
- Django中get和filter的区别
- Django数据库的数据转成Json返回
- Django全局搜索,仅适用于MySQL
四、auth用户认证模块
-
扩展Django自带的Auth认证模块
Django错误:django.db.utils.IntegrityError: (1048, "Column 'level' cannot be null")
五、admin后台管理系统
- 访问:/admin
- 创建超级管理员的账号和密码
python manage.py createsuperuser
- fields和list_display的区别
- Django报错:“Key ‘id‘ not found in ‘xxx‘. Choices are: xxx“
- 使用SimpleUI美化页面
- 安装教程
- 命令行运行pip uninstall django-simpleui先卸载一下
- 然后输入pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-simpleui重新安装
- 在settings.py文件中把debug调成true, 把simpleui加到INSTALLED_APPS最上面。
- 总体教程
- 安装教程
六、前端有关问题
-
前端页面默认路径:
-
CSS
-
images
-
HTML
-
js
七、插件使用
前端插件
-
bootstrap3插件
pip install django-bootstrap3
八、前后端数据交互
json数据
json.dumps()
: 将Python的字典结构导出到json使用;
json.loads()
: 将json读成Python的字典结构;
json.dump()
、json.load()
: 不是针对字符串的,而是针对文件的;
Python JSON:编码(转储),解码(加载)json数据和文件(示例)
不是JSON可序列化的(is not JSON serializable)
- 原因分析:
- simplejson和json不能很好地与django对象一起使用。
- Django的内置序列化程序只能序列化充满django对象的查询集,但不能包含混合的不同类型的迭代对象,比如在一个列表中有
Attraction
和Hotel
两个类型的对象-
解决办法:给model中定义的类提供一个序列化(编码、转储的方法)http://www.voidcn.com/article/p-oadxzxnv-byw.html
-
转储将像其他所有JSON可序列化对象一样,以递归方式调用序列化方法.也就是说,obj.parent也会被序列化,而不需要你做任何进一步的操作.
class MyObject: # ... # MyObject has 3 properties: name (a string), number (an int), and parent (a MyObject) @staticmethod def serialize(obj): return { "name": obj.name, "number": obj.number, "parent": obj.parent } # ... simplejson.dumps(myObjInstance, default=MyObject.serialize)
- 扩展:分支选择序列化
-
如果您只想将实例变量名称映射到它们各自的值,则可以使用一些内置的Python魔术.无论何时想要序列化更复杂的对象(同样,只使用1-1变量值映射),只需调用以下行:
simplejson.dumps(anyObj, default=lambda obj: obj.__dict__)
-
-