目录
Web应用
# python的就业方向
1. web方向---------->就是通过浏览器访问的应用程序--------->做网站的-------->90%的工作都是web
2. 爬虫岗位--------->就是爬取数据的
3. 数据分析方向------->工作岗位不是很多
4. AI----------->没有工作经验的先不要去----------->数学--------->AutoGPT----->python写的
5. ...
# 机遇与挑战并行
# web方向
'''通过浏览器访问的应用程序!!!'''
1. 两种模式C/S、B/S
B/S:browser---------------->server
2. Web应用程序的优点
2.1 只需要有一个浏览器即可
2.2 节省资源
2.3 它们不需要更新,因为所有新的特性都在服务器上执行
3. Web应用程序的缺点
# 特别依赖服务端程序的健壮性,言外之意就是一旦服务端宕机,客户端立马宕机.
4. Web框架
# 框架就是别人写好的模板,我们只需要在模板中固定的位置书写代码即可
# Django框架就是一款专门用来写web应用的框架
纯手撸web框架
1.web框架的本质
理解1:连接前端与数据库的中间介质
理解2:socket服务端
2.手写web框架
1.编写socket服务端代码
2.浏览器访问响应无效>>>:HTTP协议
3.根据网址后缀的不同获取不同的页面内容
4.想办法获取到用户输入的后缀>>>:请求数据
5.请求首行
GET /login HTTP/1.1
GET请求
朝别人索要数据
POST请求
朝别人提交数据
6.处理请求数据获取网址后缀
"""
1.socket代码过于重复
2.针对请求数据处理繁琐
3.后缀匹配逻辑过于LowB
"""
import socket
server = socket.socket() # TCP UDP
server.bind(('127.0.0.1', 8080)) # IP PORT
server.listen(5) # 半连接池
while True:
sock, address = server.accept() # 等待连接
data = sock.recv(1024) # 字节(bytes)
# print(data.decode('utf8')) # 解码打印
sock.send(b'HTTP/1.1 200 OK\r\n\r\n')
data_str = data.decode('utf8') # 先转换成字符串
target_url = data_str.split(' ')[1] # 按照空格切割字符串并取索引1对应的数据
# print(target_url) # /index /login /reg
if target_url == '/index':
# sock.send(b'index page')
with open(r'myhtml01.html','rb') as f:
sock.send(f.read())
elif target_url == '/login':
sock.send(b'login page')
else:
sock.send(b'home page!')
基于wsgiref模块
内置模块 很多web框架底层使用的模块
功能1:封装了socket代码
功能2:处理了请求数据
1.固定代码启动服务端
2.查看处理之后的request大字典
3.根据不同的网址后缀返回不同的内容>>>:研究大字典键值对
4.立刻解决上述纯手撸的两个问题
5.针对最后一个问题代码如何优化
from wsgiref.simple_server import make_server
def run(request, response):
"""
:param request: 请求相关数据
:param response: 响应相关数据
:return: 返回给客户端的真实数据
"""
response('200 OK', []) # 固定格式 不用管它
# print(request) 是一个处理之后的大字典
path_info = request.get('PATH_INFO')
if path_info == '/index':
return [b'index']
elif path_info == '/login':
return [b'login']
return [b'hello wsgiref module']
if __name__ == '__main__':
server = make_server('127.0.0.1', 8080, run) # 实时监听127.0.0.1:8080 一旦有请求过来自动给第三个参数加括号并传参数调用
server.serve_forever() # 启动服务端
jinja2模块
pip3 install jinja2
from jinja2 import Template
def get_dict_func(request):
user_dict = {'name': 'jason', 'age': 18, 'person_list': ['阿珍', '阿强', '阿香', '阿红']}
with open(r'templates/get_dict_page.html', 'r', encoding='utf8') as f:
data = f.read()
temp_obj = Template(data) # 将页面数据交给模板处理
res = temp_obj.render({'d1': user_dict}) # 给页面传了一个 变量名是d1值是字典数据的数据
return res
<p>{{ d1 }}</p>
<p>{{ d1.name }}</p>
<p>{{ d1['age'] }}</p>
<p>{{ d1.get('person_list') }}</p>
代码封装优化
1.网址后缀的匹配问题
2.每个后缀匹配成功后执行的代码有多有少
面条版 函数版 模块版
3.将分支的代码封装成一个个函数
4.将网址后缀与函数名做对应关系
5.获取网址后缀循环匹配
6.如果想新增功能只需要先写函数再添加一个对应关系即可
7.根据不同的功能拆分成不同的py文件
views.py 存储核心业务逻辑(功能函数)
urls.py 存储网址后缀与函数名对应关系
templates目录 存储html页面文件
8.为了使函数体代码中业务逻辑有更多的数据可用
将request大字典转手传给这个函数(可用不用但是不能没有)
动静态网页
1. 静态网页
# 只有页面,数据是写死的,比如html文件
2. 动态网页
# 页面中得数据是从数据库中查询出来的
1.访问某个网址后缀 后端代码获取当前时间 并将该时间传到html文件上再返回给浏览器展示给用户看
读取html内容(字符串类型) 然后利用字符串替换 最后再返回给浏览器
2.将字典传递给页面内容 并且在页面上还可以通过类似于后端的操作方式操作该数据
模板语法>>>:jinja2模块
前端、后端、数据库三者联动
1.前端浏览器访问get_user 后端连接数据库查询use表中所有的数据 传递到某个html页面 弄弄好样式 再发送给浏览器展示
{% for user_dict in user_data_list %}
<tr>
<td>{{ user_dict.id }}</td>
<td>{{ user_dict.name }}</td>
<td>{{ user_dict.age }}</td>
</tr>
{% endfor %}
python中得三大主流web框架
1. Django
# 特点:大而全(重量级的框架),里面自带了很多的功能和模块,里面也带了很多的文件
2. flask
# 特点:小而精(轻量级的框架),自身并没有多少的文件,它也一样可以做django能做的事
它严重依赖第三方模块---------->不停的安装模块---------->所以,它比较依赖第三方
# 当你在flask中安装的模块足够多的时候,也差不多类似于Django了
3. tornado
# 特点:异步非阻塞,并且支持高并发
'''我们目前学习Django框架,后面在学一个flask框架,框架有很多,不必把所有的框架学一遍,因为框架之间大差不差,比如,我们学完Django之后,在去学flask,就简单很多,只需要学习与Django不同的地方'''
Django框架
1. 版本
1.x 2.x 3.x(不学)
# 我们以1.x为主,附带2.x的区别,1.x和2.x大部分是相同的,在drf中得学习,必须用2.x
2. 安装Django
pip install django===1.11
# 以后我们自己装的第三方模块都在:site-packages文件夹下面
3. 如何验证django是否安装成功
# 在cmd中,输入django-admin,看一些是否有反应,如果有反应就说明安装成功了.
4.运行django注意事项
1.django项目中所有的文件名目录名不要出现中文
2.计算机名称尽量也不要出现中文
3.一个pycharm尽量就是一个完整的项目(不要嵌套 不要叠加)
4.不同版本的python解释器与不同版本的django可能会出现小问题
如何使用
1. 创建项目
# 1. 命令行创建
'''你可以提前切换文件夹路径,用来存储django框架的文件位置'''
django-admin startproject 项目名
django-admin startproject myfirst
# 2. pycharm创建
2. 启动django项目
# 1. cmd启动
先切换路径到manage.py这一层下面
python3 manage.py runserver # 默认启动在本地电脑上
# 2. pycharm启动
在上边导航栏中点击绿色按钮启动
"""Next, start your first app by running python manage.py startapp [app_label]."""
3. 创建应用
"""
Django框架就是一款专门用来开发web应用的
django这个框架类类似于是一所大学(空壳)
应用相当于是一所大学里面的二级学院
所以,应用是可以有多个的
eg:我们使用django开发一个淘宝出来
用户相关的功能----------->user
订单相关的功能------------>order
客服相关的功能------------>kefu
发货相关的功能------------>fahuo
...
每一个应用就是一个独立的功能
"""
# 每一个django项目至少要有一个应用!!!
4. 如何创建应用
# 1. cmd创建
********************************************************************
python3 manage.py startapp 应用名
python3 manage.py startapp app01
********************************************************************
'''
应用名都应该做到见名知意:
user
order
course
...
为了方便教学,我们统一使用app01/02/03/04...
'''
# 2. pycharm创建应用
新建项目的时候,一块创建应用
# 2.1
Tools
run manage.py task
# 在这个里面命令前面的python3 manage.py省略不写
5. 当应用创建出来之后,第一件事先去做:
# 去配置文件setting.py中去注册应用,以后每创建出来一个应用,都要去这里面去注册,如果不注册,你创建出来的应用,不生效.
********************************************************************************
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 'app01.apps.App01Config', # 注册应用,全称
'app01',
]
************************************************************************************
命令行创建和pycharm创建的区别
1. 命令行创建的项目没有templates文件夹
# 我们自己手动创建一个文件夹
2. 配置文件中:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [], # 默认没有东西
},
]
2. pycharm创建的项目会自动创建templates文件夹
配置文件中:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')] # pycharm创建出来的有东西
}
# 在配置文件中统一改成:
'DIRS': [os.path.join(BASE_DIR, 'templates')]
主要文件介绍
myfirst # 项目名称
app01 # 应用名称
migrations # 它是数据库迁移记录----------->跟数据库相关的时候才会用到
__init__.py
admin.py # 跟后台相关的
apps.py # 跟注册一些东西相关的
models.py # 这个是跟数据库相关的文件(重要)
tests.py # 这个是测试文件
views.py # 视图函数----------->主要写一些功能逻辑
app02
myfirst
__init__.py
settings.py # django框架的配置文件
urls.py # 路由文件:后缀和视图函数的对应关系
wsgi.py # 是一个服务器------->wsgiref(支持的并发量小)----------->uwsgi服务器----->支持的并发量高
db.sqlite3 # django自带的数据库,方便我们测试使用
manage.py # 这个是django框架的启动文件,入口文件
django小白必会三板斧
from django.shortcuts import render,HttpResponse,redirect
HttpResponse 返回字符串类型的数据
render 返回html页面并且支持传值
redirect 重定向
def func(request):
print('from func')
# return HttpResponse("ok!!!") # 里面写的都是字符串
# return render(request,'index.html') # 加载html文件
# return redirect('http://www.baidu.com') # 重定向
return redirect('/home/') # 重定向
标签:web,框架,后缀,创建,py,django
From: https://www.cnblogs.com/whxx/p/17337976.html